2013-04-09 10 views
33

Proszę, popraw mnie, jeśli jest to błędne: W instrukcji wypróbowania zasobów przy użyciu języka Java 7 wszelkie wyjątki wygenerowane przez metodę zasobu close() muszą zostać zadeklarowane jako odrzucone przez moją metodę lub muszę zawinąć całą próbę w inną try, która przechwytuje dowolne wyjątki zgłoszone przez close().Try-with-resources: Czy muszę rzucać lub przechwytywać wyjątki metody close()?

Jeśli tak, to muszę się zastanowić, czy z tego skorzystam. Z pewnością nie chcę, aby throw wyjątków zgłoszonych przez close(), dzwoniący nie będzie wiedział, co z tym zrobić. I try zawijanie innego try tylko do obsługi close() nie wyglądałoby zbyt elegancko, przynajmniej dla mnie.

EDYCJA: Myślę, że przypadkowo zadałem dwa pytania, z których jeden był duplikatem.

Pytanie 1. Czy muszę zadeklarować, że moja metoda wyrzuca wyjątek z metody close() lub owija try-with-resources w innej próbie? (Nie otrzymano odpowiedzi w proponowanym duplikacie).

Pytanie 2. Czy istnieje sposób na zamknięcie zasobu w trybie cichym? (Oczywiście duplikat, więc biorę to zdanie nie wchodzi w rachubę. Mam nadzieję, że to sprawia, że ​​pytanie w zadowalający sposób unikalny.)

+0

Czy masz dużo zasobów, które rzucają z 'close()'? –

+0

Tylko kilka, ale używam ich dużo (ResultSet, BufferedReader, RandomAccessFile). –

Odpowiedz

26

Cytat Java Language Specification ($14.20.3.2):

14.20.3.2 Rozszerzona try-with-zasobów

try-with-zasobów sprawozdania z przynajmniej jednej klauzuli catch i/lub wreszcie Klauzula nazywa się rozszerzoną instrukcją try-with-resources. Znaczenie dłuższy try-with-zasobów stwierdzeniem:

        spróbować ResourceSpecification
                blokowe
        Połowyopt
        Wreszcieopt

oblicza się według następującego przeliczenia na podstawowym try-with-zasobów rachunku (§14.20.3.1) zagnieżdżone wewnątrz try-catch lub próbować w końcu lub try-catch-finally stwierdzenie:

        try {
                spróbować ResourceSpecification
                        blokowe
       }
        Połowyopt
        Wreszcieopt

Efektem tłumaczenia jest umieszczenie instrukcji ResourceSpecification "inside" w celu wypróbowania instrukcji . Pozwala to na klauzulę catch w rozszerzonym teście try-with-resources wychwycenia wyjątku z powodu automatycznego inicjowania lub zamykania dowolnego zasobu.

Więc w zasadzie, owinięcie jest już realizowany

18

Od the Java tutorial

try-with-zasobów oświadczenie może mieć połowów i wreszcie bloki tak jak zwykłe oświadczenie try. W instrukcji try-with-resources, , każdy blok catch lub finally jest uruchamiany po zamknięciu zadeklarowanych zasobów..

(Kopalnia nacisk)

więc można po prostu zrobić

try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 
catch (IOException e) { 
    // handle the exception that has been thrown by readLine() OR by close(). 
} 
+0

Czy zasób zostanie zamknięty, jeśli nie zostanie wywołany catch i nie ma ostatecznie bloku? –

+0

Kliknij link i przeczytaj. –

6

Nie trzeba zawijać try-with-zasobów w innym bloku try-catch, wystarczy dodać połów blok:

class Foo implements AutoCloseable { 
    public void close() throws Exception { 
     throw new Exception(); 
    } 
} 

public class Try { 
    public static void main(final String[] args) { 
     try(Foo f = new Foo()) { 
      System.out.println("No op!"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
1

Powinieneś być w stanie po prostu dodać odpowiednią klauzulę catch (Exception e) { }. Jeśli potrzebujesz specjalnej obsługi dla konkretnej, lub możesz po prostu złapać Exception, jeśli potrzebujesz go znacznie szerszego.

try (Statement stmt = con.createStatement()) { 
    ResultSet rs = stmt.executeQuery(query); 

    while (rs.next()) { 
     String coffeeName = rs.getString("COF_NAME"); 
     int supplierID = rs.getInt("SUP_ID"); 
     float price = rs.getFloat("PRICE"); 

     System.out.println(coffeeName + ", " + supplierID + ", " + 
          price + ", " + sales + ", " + total); 
    } 
} catch (Exception e) { 
    System.out.println("Exception while trying to through the queries. ", e); 
} 

Ponieważ jest to Java 7, rzeczywiście można umieścić wiele wyjątków od klauzuli catch, lub po prostu złapać zewnętrzną wyjątek chcesz.

Powiązane problemy