42 votes

Question de conception Java try-finally return

En Java, un try { ... } finally { ... } est exécuté quelque peu unintuitively pour moi. Comme illustré dans une autre question, En Java, ne retour trump enfin?, si vous avez une instruction de retour dans le bloc try, il sera ignoré si un bloc finally est défini. Par exemple, la fonction

boolean test () {
    try {
        return true;
    }
    finally {
        return false;
    }
}

renverra toujours false. Ma question: pourquoi est-ce? Est-il une philosophie particulière derrière cette décision de conception apportées par Java? J'apprécie toute la perspicacité, je vous remercie.

Edit: je me suis particulièrement intéressé à "pourquoi" Java pense que c'est ok pour violer la sémantique que je définis. Si je 'retour' dans un bloc try, la méthode doit retourner à droite, puis et là. Mais la JVM décide d'ignorer mon instruction et de retour de sous-routine qui n'a pas encore été atteint.

39voto

Andrzej Doyle Points 52541

Techniquement parlant, l' return dans le bloc try ne sera pas ignorée si un finally bloc est défini, uniquement si le bloc finally comprend également un return.

C'est douteuse décision de conception qui était probablement une erreur dans retrospect (un peu comme les renvois de nullable/mutable par défaut, et, selon certains, checked exceptions). Dans beaucoup de façons que ce comportement est exactement compatible avec le familier de la compréhension de ce qu' finally signifie - "peu importe ce qui se passe au préalable dans l' try bloc, toujours exécuter ce code." Donc, si vous return true d'un finally bloc, l'effet global doit toujours être de retour vrai, non?

En général, c'est rarement une bonne locution, et vous devez utiliser finally blocs généreusement de nettoyage/de fermeture de ressources, mais rarement, sinon jamais retourner une valeur.

2voto

Peter Štibraný Points 17507

Si le code dans le bloc enfin se termine brusquement, il modifie la valeur de retour / l'exception du bloc try . Ceci est considéré comme une mauvaise pratique, et vous ne devriez pas le faire.

Parmi d'autres endroits, cela est également discuté dans le livre de Java Puzzlers .

0voto

anirvan Points 2306

l' finally construire, c'est une possibilité offerte par la JLS pour gérer un code sujette à quelques exceptions près. le développeur peut utiliser cette fonction afin d'assurer une gracieuse de récupération d'une exception. pour utiliser l' finally construire de la manière que vous avez décrit n'est pas une bonne pratique. d'ailleurs, il n'est jamais bon d' return rien dans le bloc finally.
donc, comme vous asekd, la "philosophie" est de gérer les brusques achèvement de code. si le retour à une certaine valeur dans le cadre de la gestion d'un tel état est nécessaire, qui doit être fait au sein de l' catch bloc.

-1voto

Starrow Pan Points 1

Bien que finalement le blocage de la fermeture des ressources soit effectué et qu’une instruction return ne soit généralement pas supposée être présente, et Eclipse avertit que "le blocage final ne s’achève pas normalement", j’ai trouvé dans certaines circonstances qu’un "retour final" était toujours souhaitable.

 ResponseType response = new ResponseType();
try{
    //set some properties of the response object.
    response.setStatus(1);
    //return response;
}catch (Exception e){
    //Some other properties of the response object according to the exception.
    response.setStatus(0);
    //return response;
}finally{
    return response;
}
 

Si je ne mets pas la clause return dans le bloc finally, je devrais la répéter dans des blocs try and catch et le code actuel est un peu plus clair.

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