77 votes

Comportement de l'instruction return dans catch et finally

Veuillez voir le code suivant et expliquer le comportement de la 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 return dans le bloc catch ?

82voto

Bozho Points 273663

Elle est remplacée par celle qui se trouve dans finally parce que finally est exécuté après tout le reste.

C'est pourquoi, une règle de base - ne reviennent jamais de finally . Eclipse, par exemple, montre un avertissement pour ce snippet : "le bloc final ne se termine pas normalement"

57voto

Vladimir Ivanov Points 23731

finally est toujours exécuté (la seule exception est System.exit() ). Vous pouvez envisager ce comportement de la manière suivante :

  1. Une exception est levée
  2. L'exception est attrapée et la valeur de retour est fixée à 5.
  3. Enfin, le bloc est exécuté et la valeur de retour est fixée à 10.
  4. La fonction renvoie

20voto

mafu Points 8920

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

  1. La valeur de retour est placée sur la pile par le code de capture.
  2. Ensuite, le code finally est exécuté et écrase la valeur sur la pile.
  3. Ensuite, la méthode renvoie la valeur la plus récente (10) à utiliser par l'appelant.

Si vous n'êtes pas sûr de ce genre de choses, faites appel à votre compréhension du système sous-jacent (en allant jusqu'au niveau assembleur).

( note complémentaire amusante )

3voto

MByD Points 78505

En finally est toujours exécuté (si le try correspondant a été exécuté), de sorte qu'avant que la méthode ne renvoie 5, comme dans l'instruction catch il exécute le bloc finally et renvoie 10.

0voto

Vikash Points 1

La section finally s'exécutera toujours. Par exemple, si vous avez quelque chose à libérer, ou une sorte de déconnexion, si une erreur se produit, allez à la section catch, sinon finally 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 l'utiliser en dehors de.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X