Question

On suppose InvalidResourceException est une sous-classe de ResourceException. Définissez deux méthodes:

void handleException(ResourceException e) {
  System.out.println("ResourceException " + e.toString());
}
void handleException(InvalidResourceException e) {
  System.out.println("InvalidResourceException " + e.toString());
}

le code suivant:

try {
  throw new InvalidResourceException("invalid resource");
} catch (ResourceException e) {
  handleException(e);
}
estampes

:

ResourceException: com.myPackage.InvalidResourceException: invalid resource

Mais le code suivant:

   try {
     throw new InvalidResourceException("invalid resource");
   } catch (InvalidResourceException e) {
     handleException(e);
   } catch (ResourceException e) {
     handleException(e);
   }
estampes

:

InvalidResourceException:  com.myPackage.InvalidResourceException: invalid resource

est avec Sun JDK 1.5.0_15.

Est-ce compatible avec la norme Java?

Qu'est-ce que ce code devrait faire?

Exception e = new InvalidResourceException("invalid resource");
handleException(e);

Qu'est-ce que ce code devrait faire?

Exception e = new InvalidResourceException("invalid resource");
if (e instanceOf ResourceException) {
  handleException(e);
} else if (e instanceOf InvalidResourceException) {
  handleException(e);
} else {
  handleException(e):
}
Était-ce utile?

La solution

Oui. C'est correct. Surcharges sont toujours résolus statiquement.

Aucune de vos 2 derniers exemples compilerons que le type statique e est Exception, et aucun de vos accepter ce type de surcharge.

Modifier

Notez que votre dernier exemple est pas vraiment un analogue direct au bloc try / catch. Dans le try / catch vous avez deux variables appelées e: une pour chaque prise, et leurs types statiques sont InvalidResourceException et ResourceException respectivement. Dans votre dernier exemple vous avez une seule variable nommée e, et son type statique est Exception. Si vous avez ajouté de nouvelles variables et qui leur sont attribuées, avec un casting alors vous obtiendrez le même comportement que votre try / catch (bien que vous auriez à perdre la branche else finale).

Autres conseils

En ce qui concerne la première partie de votre question, la bonne méthode pour appeler est déterminée au moment de la compilation en fonction du type de la variable est déclarée. Par exemple. si vous avez modifié l'instruction catch pour attraper InvalidResourceException, le HandleException (InvalidResourceException) la surcharge serait appelée à la place.

En ce qui concerne la deuxième partie de votre question, la machine virtuelle Java trouve simplement la première déclaration de capture qui est capable de gérer l'exception levée. Si vous deviez jeter un lieu ResourceException, puis le second bloc catch serait exécuté.

La troisième partie de compilation habitude, comme aucune méthode appropriée HandleException () existe pour traiter une exception plaine.

La dernière partie échouera également à compiler pour la même raison que la troisième partie.

Vous attendez quelque chose appelé « double expédition » qui ne sont pas pris en charge par java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top