Veuillez consulter le code suivant et expliquer le comportement de sortie.
public class MyFinalTest {
public int doMethod(){
try{
throw new Exception();
}
catch(Exception ex){
return 5;
}
finally{
return 10;
}
}
public static void main(String[] args) {
MyFinalTest testEx = new MyFinalTest();
int rVal = testEx.doMethod();
System.out.println("The return Val : "+rVal);
}
}
Le résultat est le retour Val: 10.
Eclipse affiche un avertissement: finally block does not complete normally
.
Qu'advient-il de l'instruction de retour dans le bloc catch?
Il est remplacé par celui de finally
, car finally
est exécuté après tout le reste.
C'est pourquoi, une règle de base - ne revenez jamais de finally
. Eclipse, par exemple, affiche des avertissements pour cet extrait: "finalement le bloc ne se termine pas normalement"
finally
est toujours exécuté (la seule exception est System.exit()
). Vous pouvez penser à ce comportement de cette façon:
C'est une question facile si vous vous souvenez de la disposition de bas niveau de la machine virtuelle.
Si vous n'êtes pas sûr de ce genre de choses, revenez à votre compréhension du système sous-jacent (en fin de compte, passez au niveau assembleur).
( sidenote drôle )
Enfin, le bloc est toujours exécuté à moins que et jusqu'à ce que l'instruction System.exit () soit la première dans le bloc enfin.
Ainsi, dans l'exemple ci-dessus, Exection est lancée par l'instruction try et obtient catch dans le bloc catch. Il y a une déclaration de retour avec une valeur 5 donc dans la valeur d'appel de la pile 5 obtient ajouté plus tard, finalement le bloc est exécuté et la dernière valeur de retour est ajoutée au-dessus de la pile lors du retour de la valeur, la pile retourne la dernière valeur selon le comportement de la pile "LAST IN FIRST OUT" donc il renverra la valeur comme 10.
Le bloc finally
est toujours exécuté (si la tentative de correspondance a été exécutée) donc avant que la méthode ne retourne 5 comme dans le bloc catch
, elle exécute le bloc finally
et retourne 10.
la section finalement s'exécutera toujours exécutera. par exemple. si vous avez quelque chose à publier, ou déconnectez-vous en quelque sorte, si une erreur se produit, passez à la section catch sinon, enfin, s'exécutera.
Session session // opened some session
try
{
// some error
}
catch { log.error }
finally
{ session.logout();}
il ne doit pas être utilisé pour retourner quoi que ce soit. vous pouvez utiliser en dehors de.