2013-10-03 4 views
1

Dans le code écrit ci-dessous bien que je n'ai pas attrapé le ArithmeticException, pourtant l'exception est traitée automatiquement et avec finally Bloquer, le contenu de la méthode main() est exécuté avec succès. Alors que si je supprime l'instruction return de finally et que je rends démo comme void, alors le programme après avoir exécuté finally jette MainThreadException .. pourquoi est-ce vrai?Mise en œuvre du bloc de fin

public class FinallyDemo { 

    int demo() {   
    try { 
     int a=5/0;   
    }   
    finally { 
     System.out.println("Finally Executed"); 
     return 10; 
    } 
    } 

    public static void main(String s[]) { 
    int a=new FinallyDemo().demo(); 
    System.out.println("Exception Handled"); 
    } 
} 
+3

Le bloc 'finally' avale simplement votre exception. –

+4

Whoa, * way way * trop d'espace ... – chrylis

+0

a attrapé l'exception pas mis en cache –

Répondre

4

Parce que vous return du bloc finally, l'exception est disposé en silence. Vous devriez jamais revenir d'un bloc finally! (Eh bien, presque toujours jamais).

de la langue Java Spécification:

Si le bloc finally se termine brusquement pour une raison S, l'instruction try se termine brusquement pour une raison S (et la raison R est mis au rebut).

Cela signifie aussi si vous jetiez une autre exception, comme un IllegalStateException, du bloc finally, l'exception d'origine serait également mis au rebut.

+1

* Eh bien, presque toujours jamais. * Alors, quand doit-on revenir d'un bloc finalement? :) –

+1

La citation de JLS n'a pas expliqué le comportement de retour, ou est-ce un retour à l'intérieur d'une fin finalement abrupte? – AlexWien

+0

@AlexWien Je comprends qu'un «retour» d'un «finally» est en effet considéré comme «abrupt». –