web-dev-qa-db-fra.com

Comportement de l'instruction return dans catch et enfin

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?

67
Ammu

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"

73
Bozho

finally est toujours exécuté (la seule exception est System.exit()). Vous pouvez penser à ce comportement de cette façon:

  1. Une exception est levée
  2. Une exception est interceptée et la valeur de retour est définie sur 5
  3. Enfin, le bloc est exécuté et la valeur de retour est définie sur 10
  4. La fonction retourne
50
Vladimir Ivanov

C'est une question facile si vous vous souvenez de la disposition de bas niveau de la machine virtuelle.

  1. La valeur de retour est mise en place par le code catch.
  2. Ensuite, le code finalement est exécuté et écrase la valeur sur la pile.
  3. Ensuite, la méthode retourne avec la valeur la plus récente (10) à utiliser par l'appelant.

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 )

18
mafu

enter image description here

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.

3
Avinash Pande

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.

3
MByD

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.

0
Vikaaa..