6

Ich habe den folgenden CodeHinzufügen Rückkehr in schließlich versteckt die Ausnahme

public static void nocatch() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 

    } 
} 

, die den Fehler

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Unhandled exception type CustomException 

gibt, die als erwartet, aber das Hinzufügen einer return Anweisung im finally Block den Fehler macht Geh weg

public static void nocatch() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 
     return; //makes the error go away! 
    } 
} 

Kann mir bitte jemand erklären, was ist geht es weiter? und warum der Fehler verschwindet?

Hinweis: Ich habe diesen Code nur für experimentelle Zwecke geschrieben!

+1

Zugehörige Beitrag: [Versuchen Sie schließlich die Ausführung blockiert] (http://stackoverflow.com/q/18131447/1679863). Obwohl das nicht über die Ausnahme spricht, ist die Begründung dafür gleich. –

+1

Randbemerkung: Versuchen Sie nicht, Code auszuführen, der nicht kompiliert wird. Das hat wirklich keinen Vorteil. Sprechen Sie über den Fehler bei der Kompilierung und nicht über die Ausnahme, die Sie beim Ausführen von Code erhalten, der noch nicht kompiliert wurde. –

+0

@JonSkeet Ich wollte nur auf den Fehler hinweisen, den es verursacht hat, weshalb ich den Code ausgeführt habe. – codeMan

Antwort

7

Der Fehler verschwindet, weil Ihr Code jetzt gültig ist. (. Nicht schön, aber gültig)

Wenn ein finally Block nur eine gerade return; Anweisung hat, dann die Gesamt try/catch/finally oder try/finally-Anweisung keine Ausnahmen auslösen kann - so brauchen Sie nicht zu erklären, dass es kann eine Ausnahme auslösen.

In Ihrem ursprünglichen Code, Ihr try Block könnte (na ja, es wird) wirft Exception (oder CustomException in Ihrem realen Code, scheinbar) - und das ist eine geprüfte Ausnahme, das heißt, Sie haben entweder zu fangen oder zu erklären dass die Methode es werfen könnte.

+0

Ich frage mich, ob die Ausnahme-Tötungsverhalten der Rückkehr in Java 's endlich Blöcke war eine absichtlich zur Verfügung gestellte Funktion, oder wenn Gosling et al. einfach nicht gedacht, dass es die Mühe wert war zu verhindern? Ich hoffe, es war Ersteres, aber wenn das der Fall wäre, wäre es gut für Gosling et al. Gewesen. eine "nicht erzwungene Anforderung" dokumentiert zu haben, die ein "finally" -Baustein nur * legitim * zurückgeben darf, wenn der Code weiß, dass keine Ausnahme ausstehen kann (zB weil ein Flag als allerletzte Operation in einem 'try' oder 'Fang'-Block). – supercat

0

Gemäß der javadoc ...

The finally block always executes when the try block exits. 
This ensures that the finally block is executed even if an unexpected exception occurs. 

So wird Ihr Code es jetzt richtig zu tun.

+0

Können Sie einen Link hinzufügen? – DataDino

+1

@DataDino https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html –