2535 votes

N'a finalement toujours exécuter en Java?

J'ai un bloc try/catch avec des retours à l'intérieur. Va le bloc finally être appelé?

Par exemple:

try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("i don't know if this will get printed out.");
}

Je sais que je peux tapez simplement ceci dans un voir ce qui se passe (c'est ce que je suis sur le point de le faire, en fait) mais quand j'ai googlé pour les réponses, rien n'est venu, alors j'ai pensé que je jetterais une telle question.

2871voto

jodonnell Points 14999

enfin sera appelée.

Le seul moment où, enfin, ne sera pas appelé c'est que si vous Système d'appel.exit() ou si la machine se bloque en premier.

595voto

Kevin Points 2223

//la preuve de code

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

    public static int test()
    {
    	try {  
            	return 0;  
    	}  
    	finally {  
    	    System.out.println("finally trumps return.");
    	}
    }
}

sortie:

finally trumps return. 
0

406voto

MooBob42 Points 1265

Aussi, même si c'est une mauvaise pratique, si il y a une instruction return dans le bloc finally, il l'emporte sur tout autre retour dans le bloc. C'est, à la suite de bloc return false:

try { return true; } finally { return false; }

Même chose à jeter des exceptions à partir du bloc finally.

261voto

polygenelubricants Points 136838

Voici l'officiel paroles de la Java Langage de Spécification.

JLS 14.20.2 Exécution de try-catch-finally

Un try déclaration avec un finally bloc est exécuté par la première exécution de l' try bloc. Puis il y a le choix:

  • Si l'exécution de l' try bloc se termine normalement, [...]
  • Si l'exécution de l' try bloc se termine brusquement en raison d'un throw de la valeur V, [...]
  • Si l'exécution de l' try bloc se termine brusquement pour toute autre raison R, alors l' finally bloc est exécuté. Puis il y a le choix:
    • Si le bloc finally se termine normalement, puis l' try instruction se termine brusquement de raison R.
    • Si l' finally bloc se termine brusquement pour des raisons de S, puis l' try instruction se termine brusquement pour des raisons de S (et la raison R est ignoré).

Le cahier des charges pour return fait réellement cette explicites:

JLS 14.17 L'Instruction de retour

ReturnStatement:
     return Expression(opt) ;

Un return sans Expression des tentatives de transférer le contrôle à l'appelant de la méthode ou d'un constructeur qui le contient.

Un return déclaration avec une Expression des tentatives de transférer le contrôle à l'appelant de la méthode qu'il contient; la valeur de l' Expression devient la valeur de l'invocation de la méthode.

Les précédentes descriptions de dire "les tentatives de transfert de contrôle" plutôt que simplement "les transferts de contrôle", car s'il y a des try instructions à l'intérieur de la méthode ou d'un constructeur dont l' try blocs contiennent l' return déclaration, puis tout finally clauses de ceux - try instructions seront exécutées dans l'ordre, plus intime ultrapériphériques, avant que le contrôle est transféré à l'invocateur de la méthode ou d'un constructeur. Brusque de l'achèvement d'un finally clause peut perturber le transfert de contrôle initiée par un return déclaration.

168voto

Eyal Schneider Points 11399

En plus des autres réponses, il est important de souligner que "enfin" a le droit de remplacer toute exception/la valeur retournée par le bloc try..catch. Par exemple, le code suivant renvoie 12:

public static int getMonthsInYear(){
    try{
        return 10;
    } finally {
        return 12;
    }
}

De même, la méthode suivante ne jette pas une exception:

public static int getMonthsInYear(){
    try{
        throw new RuntimeException();
    } finally {
        return 12;
    }
}

Si la méthode ne jeter:

public static int getMonthsInYear(){
    try{
        return 12;          
    } finally {
        throw new RuntimeException();
    }
}

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