2016-08-24 3 views
-1

Ich bin ziemlich neu in Java und nicht in der Lage, den Kontrollfluss in try-catch-finally-Blöcken zu verstehen. Immer wenn eine Ausnahme in einem catch-Block abgefangen wird, wird auch der Code nach dem catch-Block ausgeführt, unabhängig davon, ob ich ihn in einen finally-Block platziere oder nicht. Was nützt dann der Block?Flusskontrolle in der Ausnahmebehandlung

class Excp 
{ 
public static void main(String args[]) 
{ 
    int a,b,c; 
    try 
    { 
    a=0; 
    b=10; 
    c=b/a; 
    System.out.println("This line will not be executed"); 
    } 
    catch(ArithmeticException e) 
    { 
    System.out.println("Divided by zero"); 
    } 
    System.out.println("After exception is handled"); 
} 
} 

Es gibt keinen Unterschied, wenn ich die letzte Druckanweisung innerhalb des finally-Blocks platziere.

+0

Werfen Sie eine 'neue RuntimeException()' innerhalb des 'try' und Sie werden feststellen, dass der Code nach dem catch-Block nicht ausgeführt wird. Dann füge einen finally-Block hinzu. – Kayaman

+0

Sie verwenden den 'finally'-Block, um Ihr Programm auf einen Status zu setzen, mit dem es arbeiten kann, nachdem eine Ausnahme eingetreten ist. – Blobonat

+1

Der Code innerhalb des finally-Blocks ** wird immer ausgeführt **, auch wenn im "try" oder "catch" eine "return" oder eine unbehandelte Ausnahme ist. Dies wird [hier] (https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html) erklärt, was mit einer wirklich einfachen Google-Suche gefunden wurde. ** Bitte verwenden Sie Google. ** –

Antwort

2

Es macht einen Unterschied, ob eine weitere Ausnahme (nicht behandelt durch Ihren Code) im Block passiert.

Ohne finally würde die letzte Zeile nicht ausgeführt. Mit finally wird der Code ausgeführt, egal was.

Dies ist besonders nützlich Bereinigungsaufgaben außerhalb der Reichweite der Garbage Collector ausführen: System-Ressource, Datenbank-Sperre, Löschen von Dateien etc ...

0

Der finally Block wird auch ausgeführt, wenn eine Ausnahme von den catch geworfen wird blockieren, oder wenn eine andere Ausnahme aus dem Block try ausgelöst wird.

Beispiele:

try { 
    int a=5; 
    int b=0; 
    int c=a/b; 
catch (NullPointerException e) { 
    // won't reach here 
} finally { 
    // will reach here 
} 

Sie auch den catch-Block ganz weglassen können und garantieren immer noch, dass der finally-Block ausgeführt wird: diese

try { 
    int a=5; 
    int b=0; 
    int c=a/b; 
} finally { 
    // will reach here 
} 
1

Bedenken Sie:

try { 
    a=0; 
    b=10; 
    c=b/a; 
    System.out.println("This line will not be executed"); 
} 
catch(ArithmeticException e){ 
    throw new RuntimeException("Stuff went wrong", e); 
} 
System.out.println("This line will also not be executed"); 
0

Die Code innerhalb der finally Block immer führt, sogar wenn in der try oder catch gibt es eine return oder eine unbehandelte Ausnahme. Dies ist here erläutert, die mit einer wirklich einfachen Google-Suche gefunden wurde. Bitte verwenden Sie Google.

1

Der finally-Block kann verwendet werden, um ausgeführt zu werden, auch wenn eine Funktion zurückkehrt.

z.B.

public boolean doSmth() { 
    try { 
    return true; 
    } 
    finally { 
    return false; 
    } 
} 

würde false zurückgeben;