Maison > Java > javaDidacticiel > Une méthode de sous-classe peut-elle lancer des exceptions vérifiées plus larges que sa méthode de superclasse ?

Une méthode de sous-classe peut-elle lancer des exceptions vérifiées plus larges que sa méthode de superclasse ?

Linda Hamilton
Libérer: 2024-11-29 09:57:11
original
967 Les gens l'ont consulté

Can a Subclass Method Throw Broader Checked Exceptions Than Its Superclass Method?

Comprendre les déclarations d'exception de méthode de remplacement

En Java, lors du remplacement d'une méthode dans une sous-classe, la méthode de remplacement doit respecter certaines règles concernant le lancement exceptions. Plus précisément, la méthode de substitution ne peut pas lever d'exceptions vérifiées qui sont nouvelles ou plus larges que celles déclarées par la méthode surchargée.

Par exemple, si une méthode de classe de base déclare lever une exception FileNotFoundException, la méthode de substitution dans une sous-classe ne peut pas lever une exception SQLException, une exception ou toute autre exception non-exécutable qui n'est pas une sous-classe de FileNotFoundException.

Raisonnement derrière le Restriction

Cette restriction découle du principe de polymorphisme et du principe de substitution de Liskov (LSP). LSP déclare qu'une sous-classe doit être substituable à sa classe de base dans toutes les circonstances, de sorte que le comportement du programme reste correct.

Si la méthode de substitution était autorisée à lever des exceptions plus larges, elle violerait LSP. Par exemple, si la méthode de la classe de base foo() déclare lever une IOException et que la méthode de substitution déclare lever une SQLException, le compilateur ne forcera plus l'appelant à gérer IOException.

Cependant, lorsqu'une sous-classe est traitée comme sa classe de base, l'appelant ne peut pas s'attendre ou être prêt à gérer des exceptions plus larges levées par la méthode de substitution. Cela entraînerait des exceptions d'exécution et un comportement imprévisible.

Exemple

Considérez le code suivant :

class A {
   public void foo() throws IOException {..}
}

class B extends A {
   @Override
   public void foo() throws SocketException {..} // allowed

   @Override
   public void foo() throws SQLException {..} // NOT allowed
}
Copier après la connexion

Dans cet exemple, la méthode de remplacement dans la classe B peut lancer une SocketException car il s'agit d'une sous-classe de IOException. Cependant, il ne peut pas lancer une exception SQLException car SQLException n'est pas une sous-classe de IOException.

Exceptions non vérifiées

Les exceptions non vérifiées ne sont pas soumises à cette restriction. Ils peuvent être lancés par des méthodes substituées, qu'elles soient ou non déclarées dans la clause throw de la méthode substituée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal