Je pense que ce sont les citations pertinentes de JLS 14.21 :
-
Un bloc vide qui n'est pas un bloc switch peut se terminer normalement s'il est accessible.
Un bloc non vide qui n'est pas un bloc switch peut se terminer normalement si la dernière instruction à l'intérieur peut se terminer normalement.
La première instruction dans un bloc non vide qui n'est pas un bloc switch est accessible si le bloc est accessible.
Chaque autre instruction S dans un bloc non vide qui n'est pas un bloc switch est accessible si l'instruction précédant S peut se terminer normalement.
Donc votre
System.out.println("Suis-je inaccessible ??!!!");
est accessible si l'instruction try peut se terminer normalement, ce qui nous mène à la citation suivante :
Étant donné que votre bloc catch
peut se terminer normalement et vous avez un bloc finally
qui peut se terminer normalement, l'instruction try
peut se terminer normalement. Par conséquent, l'instruction System.out.println("Suis-je inaccessible ??!!!");
qui suit est considérée comme accessible, peu importe l'instruction return;
à l'intérieur du bloc try
.
Remarquez le ou
dans
Le bloc try peut se terminer normalement ou un bloc catch quelconque peut se terminer normalement.
Cela signifie que soit le bloc try
soit au moins l'un des blocs catch
doivent se terminer normalement. Ils ne doivent pas nécessairement tous les deux se terminer normalement.
Enfin, la logique derrière ce comportement :
Le compilateur n'est pas censé analyser si un bloc try peut ou non lever une Exception
. La raison en est que la hiérarchie de classes Exception
inclut à la fois des exceptions vérifiées et des exceptions non vérifiées, et les exceptions non vérifiées ne sont pas déclarées dans des clauses throws
(si vous remplacez Exception
par une exception vérifiée, comme IOException
, le compilateur vous signalerait que votre bloc try ne lance jamais cette exception, rendant le bloc catch
inaccessible).
Par conséquent, étant donné que vous avez un bloc catch (Exception e)
qui peut se terminer normalement, le compilateur suppose que ce bloc catch
est accessible, et donc que l'ensemble de l'instruction try peut se terminer normalement, même si le bloc try
ne peut pas se terminer normalement.
Le bloc finally, s'il est présent, doit également pouvoir se terminer normalement, car le bloc finally
est également exécuté, donc s'il ne pouvait pas se terminer normalement, l'ensemble de l'instruction try ne pourrait pas se terminer normalement.
23 votes
Eh bien, en cas d'exception, le code pourrait être atteignable. Peut-être que le compilateur l'a remarqué.
1 votes
Avez-vous envisagé le cas de capture ? Dans le bloc try, que retournerez-vous s'il y a une exception levée ?
3 votes
@TimBiegeleisen A quel type d'exception tu penses qu'elle sera levée dans cet exemple?
1 votes
@LightnessRacesinOrbit Je commentais en général. Dans l'extrait de code ci-dessus, je ne m'attendrais pas à ce qu'une exception soit lancée. Mais, apparemment, le compilateur Java pense toujours que c'est une possibilité :-)
0 votes
@TimBiegeleisen Les chiffres, hein? :)
0 votes
Cette question semble provenir de JDK-8193860