web-dev-qa-db-fra.com

Pouvons-nous utiliser "retour" dans le bloc enfin

Pouvons-nous utiliser l'instruction return dans le bloc enfin. Cela peut-il causer des problèmes?

37
Rakesh KR

Le retour de l'intérieur d'un bloc finally entraînera la perte de exceptions.

Une instruction return à l'intérieur d'un bloc finally entraînera l'élimination de toute exception qui pourrait être levée dans le bloc try ou catch.

Selon la spécification du langage Java :

Si l'exécution du bloc try se termine brutalement pour toute autre raison R, alors le bloc finally est exécuté, puis il y a un choix:

   If the finally block completes normally, then the try statement
   completes  abruptly for reason R.

   If the finally block completes abruptly for reason S, then the try
   statement  completes abruptly for reason S (and reason R is
   discarded).

Remarque: selon JLS 14.17 - une instruction de retour se termine toujours brusquement.

44
Ankur Lathi

Oui, vous pouvez écrire l'instruction return dans un bloc finally et elle remplacera l'autre valeur de retour.

MODIFIER:
Par exemple dans le code ci-dessous

public class Test {

    public static int test(int i) {
        try {
            if (i == 0)
                throw new Exception();
            return 0;
        } catch (Exception e) {
            return 1;
        } finally {
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println(test(0));
        System.out.println(test(1));
    }
}

La sortie est toujours 2, car nous renvoyons 2 du bloc finally. N'oubliez pas que finalement s'exécute toujours s'il y a une exception ou non. Ainsi, lorsque le bloc finalement s'exécute, il remplace la valeur de retour des autres. Il n'est pas nécessaire d'écrire des instructions de retour dans le bloc finally, en fait, vous ne devriez pas l'écrire.

27
Krushna

Oui, vous pouvez, mais vous ne devriez pas 1, car le bloc finalement est destiné à un usage spécial.

enfin, il est utile pour plus que la gestion des exceptions - il permet au programmeur d'éviter que le code de nettoyage soit accidentellement contourné par un retour, une poursuite ou une interruption. Placer du code de nettoyage dans un bloc finally est toujours une bonne pratique, même si aucune exception n'est prévue.

Il n'est pas recommandé d'écrire votre logique à l'intérieur.

3
Suresh Atta