Warum Try-With-Resources ohne Catch oder Final schreiben?

Lesezeit: 3 Minuten

Benutzeravatar von Umair Hashmi
Umair Hashmi

Warum schreiben Sie Try ohne Catch oder Final wie im folgenden Beispiel?

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet tryse</title>");            
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet tryse at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }

}

  • Lesen Sie mehr über Versuche mit Ressourcen (Java 7)

    – Eran

    14. Oktober 2014 um 9:08 Uhr

  • Sehen Versuchen Sie es mit Ressourcen

    – Justin

    14. Oktober 2014 um 9:10 Uhr

  • Duplikat von „Ist es sinnvoll, „try-finally“ ohne „catch“ zu machen?“

    – Juru

    14. Oktober 2014 um 9:12 Uhr


  • @Juru: Dies ist in keiner Weise ein Duplikat davon …

    – Oliver Charlesworth

    14. Oktober 2014 um 9:13 Uhr

  • Allerdings glaube ich nicht, dass dies die erste Frage zu Try-with-Ressourcen ist. Trotzdem +1, einfach weil ich noch nie von dieser Funktion gehört hatte!

    – Oliver Charlesworth

    14. Oktober 2014 um 9:13 Uhr

Benutzeravatar von Syed Ali Taqi
Syed Ali Taqi

Wie oben erläutert, ist dies eine Funktion in Java 7 und höher. try with resources ermöglicht das Schreiben der zu überspringen finally und schließt alle verwendeten Ressourcen try-block selbst. Wie angegeben in Dokumente

Jedes Objekt, das java.lang.AutoCloseable implementiert, einschließlich aller Objekte, die java.io.Closeable implementieren, kann als Ressource verwendet werden.

Siehe dieses Codebeispiel

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

In diesem Beispiel ist die Ressource BufferReader Objekt, da die Klasse die Schnittstelle implementiert java.lang.AutoCloseable und es wird geschlossen, ob der try-Block erfolgreich ausgeführt wird oder nicht, was bedeutet, dass Sie nichts schreiben müssen br.close() ausdrücklich.

Eine weitere wichtige Sache, die hier zu beachten ist ist das, wenn Sie das schreiben finally blockieren Sie sich und Ihre beiden try und finally block throw exception dann die Ausnahme aus try Block wird unterdrückt.

Während auf der anderen Seite, wenn Sie verwenden try-with-resources Anweisung und Ausnahme wird von beiden ausgelöst try blockieren und try-with-resources Anweisung dann in diesem Fall die Ausnahme von try-with-resources Aussage unterdrückt.

Da der @Aaron bereits oben geantwortet hat, habe ich nur versucht, es Ihnen zu erklären. Ich hoffe es hilft.

Quelle: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

  • Es ist also analog zu C#’s using & IDisposable ‘s.

    – roufamatisch

    25. Oktober 2016 um 17:26 Uhr

  • @roufamatic ja, analog, obwohl der große Unterschied darin besteht, dass C # ist using schützt in keiner Weise vor Ausnahmen, sondern garantiert nur das Schließen der Ressourcen am Ende des Blocks. In C# müssen Sie meistens kombinieren using Blöcke mit try Blöcke. Javas try-with-resources macht das gemeinsam.

    – Michael Plautz

    27. April 2018 um 4:26 Uhr

Benutzeravatar von Aaron Digulla
Aaron Digulla

Dies ist eine neue Funktion in Java 7 und höher. Ohne dies benötigen Sie eine finally Block, der die Ressource schließt PrintWriter out. Der obige Code ist also äquivalent zu:

PrintWriter out = null;
try {
    PrintWriter out = ...
} finally {
    if(null != out) {
        try {
            out.close();
        } catch(Exception e) {} // silently ignore!
    }
}

Sehen Die try-with-resources-Anweisung

  • Sie sind nicht gleichwertig. Wenn die Ausnahme sowohl von try als auch von finally blockiert wird, wird die Ausnahme vom try-Block mit try-and-catch unterdrückt. Wenn Sie dagegen die try-with-resources-Anweisung verwenden, wird die Ausnahme vom finally-Block (Ausnahme beim automatischen Schließen) unterdrückt.

    – Nier

    21. Dezember 2017 um 9:30 Uhr

  • @Nier Den Endgültigen Teil behoben.

    – Aaron Digulla

    30. Dezember 2017 um 10:27 Uhr

1431130cookie-checkWarum Try-With-Resources ohne Catch oder Final schreiben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy