En Java, le bloc finally ne sera pas exécuté si nous insérons une instruction return dans Le bloc try d'un try-catch-finally?
La seule fois où un bloc finally
ne sera pas exécuté est lorsque vous appelez exit()
avant que finally
ne soit atteint. L'appel exit()
arrêtera la machine virtuelle Java. Aucune ligne de code ultérieure ne sera exécutée.
EDIT: Ce n'est pas tout à fait correct. Voir les commentaires ci-dessous pour plus d'informations.
Le bloc finally s'exécutera toujours, que vous retourniez ou qu'une exception soit levée dans le bloc try.
Voir aussi la section 14.19.2 Exécution de try-catch-finally de la spécification du langage Java
Le bloc finally est exécuté dans tous ces cas. Le but d’exécuter finalement block à la fin est de vous permettre de libérer toutes les ressources acquises.
Voici un exemple qui montre comment cela fonctionne.
public class Hello {
public static void hello(){
try{
System.out.println("hi");
return;
}catch(RuntimeException e){
}finally{
System.out.println("finally");
}
}
public static void main(String[] args){
hello();
}
}
Il est exécuté même si vous revenez dans le bloc try. Je mets une déclaration de retour à l'intérieur try et une à l'intérieur, enfin, et la valeur renvoyée était finalement, pas de try.
public class HelloWorld{
public static void main(String args[]){
System.out.println(printSomething());
}
public static String printSomething(){
try{
return "tried";
} finally{
return "finally";
}
}
}
La sortie que j'ai obtenue était "finalement".
Selon le explication officielle :
Remarque: Si la machine virtuelle Java se ferme pendant l'exécution du code try ou catch, le bloc finally peut ne pas s'exécuter. De même, si le thread exécutant le code try ou catch est interrompu ou tué, le bloc finally peut ne pas s'exécuter même si l'application continue dans son ensemble.
Je pense que c'est une bonne idée que nous devrions nous référer au site officiel avant de poster une réponse ici.
Si votre bloc finally a un retour, il remplacera tout retour dans un bloc try-catch.Parce que cette "fonctionnalité" est une bonne pratique, finalement, le bloc ne devrait jamais lever une exception ou avoir une instruction return.
Chaque fois qu'une méthode tente de retourner à l'appelant, via une exception non capturée ou une instruction de retour explicite, la clause finally est également exécutée juste avant le retour de la méthode.