2014-06-09 21 views
25

In Java 7's try-with-resources weiß ich nicht, in welcher Reihenfolge der finally-Block und das automatische Schließen passiert. Was ist der Auftrag?Sind Ressourcen vor oder nach dem Abschluss geschlossen?

BaseResource b = new BaseResource(); // not auto-closeable; must be stop'ed 
try(AdvancedResource a = new AdvancedResource(b)) { 

} 
finally { 
    b.stop(); // will this happen before or after a.close()? 
} 

Antwort

39

Die Ressource wird vor dem Fang geschlossen oder schließlich blockiert. Siehe hierzu tutorial.

Eine try-with-resources-Anweisung kann fangen und schließlich wie eine normale try-Anweisung blockieren. In einer try-with-resources-Anweisung wird jeder catch- oder finally-Block ausgeführt, nachdem die deklarierten Ressourcen geschlossen wurden.

Um zu bewerten, dies ist ein Beispielcode:

class ClosableDummy implements Closeable { 
    public void close() { 
     System.out.println("closing"); 
    } 
} 

public class ClosableDemo { 
    public static void main(String[] args) { 
     try (ClosableDummy closableDummy = new ClosableDummy()) { 
      System.out.println("try exit"); 
      throw new Exception(); 
     } catch (Exception ex) { 
      System.out.println("catch"); 
     } finally { 
      System.out.println("finally"); 
     } 


    } 
} 

Ausgang:

try exit 
closing 
catch 
finally 
+0

verrückt. Daher ist Try-with-resources kein guter Ersatz für try-catch-finally, wenn die Ressource benötigt wird, um den Catch zu behandeln. – Gustavo

+0

Ressourcen müssen nicht im 'catch' Block behandelt werden. –

+0

Der catch-Block benötigt möglicherweise die Ressource, um seine Aufgabe abzuschließen. – Gustavo