2014-06-09 6 views
25

W Try-z-zasobach Java 7, nie wiem, która kolejność bloku końcowego i automatyczne zamykanie się dzieje. Jaka jest kolejność?Czy zasoby zostały zamknięte przed lub po końcu?

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()? 
} 

Odpowiedz

39

Zasób zostanie zamknięty przed złapaniem lub w końcu blokuje. Zobacz tę tutorial.

Instrukcja try-with-resources może przechwycić i ostatecznie zablokować, podobnie jak zwykłe polecenie try. W instrukcji try-for-resources blok catch lub finally jest uruchamiany po zamknięciu zadeklarowanych zasobów.

Aby ocenić to przykładowy kod:

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"); 
     } 


    } 
} 

wyjściowa:

try exit 
closing 
catch 
finally 
+0

szalony. Tak więc Try-with-resources nie jest dobrym zamiennikiem dla try-catch-finally, gdy zasób jest potrzebny do obsługi catch. – Gustavo

+0

Zasoby nie wymagają obsługi w bloku 'catch'. –

+0

Blok catch może potrzebować zasobu do wykonania zadania. – Gustavo

Powiązane problemy