6
votes

EXCEPTION EXCEPTION DE JAVA EXCEPTION EXCEPTION VS IOException

Le code suivant compile OK même si le bloc d'essai ne jette aucune exception. XXX PRE>

mais si la capture est remplacée par une sous-classe d'exception, le code gagné ' t compiler. P>

public static void main(String[] args)  {
    try {} 
    catch (IOException e) {} // won't compile. 
}


1 commentaires

RunTimeException S est également exception s, donc toutes les exceptions ne sont donc pas cochées.


3 Réponses :


8
votes

Le compilateur peut savoir exactement quelle partie du code peut lancer un ioException car il s'agit d'une exception cochée , donc chaque méthode pouvant lancer ce type d'exception doit spécifier dans la signature de la méthode.

D'autre part, l'exécution ou les exceptions non cochées ne sont pas censées être attendues, et étant donné que RunTimeException (la classe mère des exceptions non cochées) étend également la classe Exception , puis le compilateur est correct avec celui-ci.


0 commentaires

3
votes

Exception a des sous-classes non cochées d'exceptions ( RunTimeException étend exception ). jetable se comportera de la même manière. RunTimeException ou sous-classes de RunTimeException se comportera de la même manière. Sous-classes de Exception autre que RunTimeException ne sera pas.


0 commentaires

3
votes

La réponse de Manouti semble correcte, mais selon la documentation Java:

C'est une erreur de compilation si une clause de capture attrape un type d'exception vérifié Type E1, mais il n'existe pas de type d'exception vérifié Type E2 de telle que toutes les personnes suivantes:

E2 <: E1 Le bloc d'essai correspondant à la clause de capture peut lancer e2 Pas de bloc de prise précédent de la déclaration d'essai immédiatement entourant attrape E2 ou un super-espèce de E2. Sauf si e1 est l'exception de classe.

Il existe un cas explicite pour le lancement d'une instance (la classe est exceptionnelle, on pourrait dire). C'est la documentation Java 5, mais à moins que quelqu'un ne voit autrement, je doute fort que cela ait changé depuis

regarder l'arborescence d'héritage pour exception et ioexception

https://docs.oracle.com/ Javase / 7 / Docs / API / Java / Lang / Exception.html

et

https: // docs.oracle.com/javase/7/docs/api/java/io/ioException.html?is-external=true

Dans Java 7, je ne vois pas que la discussion sur des exceptions cochées / décochées est directement pertinente - alors qu'il est vrai que des exceptions non cochées ne suivent pas les mêmes règles, des exceptions non cochées doivent hériter de runtimédiesxception , que exception n'est bien sûr pas (c'est le parent de cette classe)

https://docs.oracle. COM / Javase / Spécifications / JLS / SE5.0 / HTML / Classes.HTML # 308526

(Encore une fois, Java 5 docs, mais cela n'a pas changé) https://docs.oracle.com/javase/specs /jls/se5.0/html/Exception.html


0 commentaires