web-dev-qa-db-ja.com

Try-With-ResourcesをCatchまたは最後に記述しないのはなぜですか?

次の例のように、キャッチなしで、または最後にTryを書く理由は何ですか?

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

}
30
Umair Hashmi

上記で説明したように、これはJava 7以降の機能です。try with resourcesfinallyの書き込みをスキップし、try-block自体で使用されているすべてのリソースを閉じます。 ドキュメント

Java.io.Closeableを実装するすべてのオブジェクトを含むJava.lang.AutoCloseableを実装するオブジェクトは、リソースとして使用できます。

このコード例を参照してください

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

この例では、クラスがインターフェイスJava.lang.AutoCloseableを実装するため、リソースはBufferReaderオブジェクトであり、tryブロックが正常に実行されるかどうかにかかわらず閉じられます。つまり、br.close()を記述する必要はありません。明示的に。

ここで注意すべきもう1つの重要なことは、あなたがfinallyブロックを自分で書いている場合、そしてあなたのtryfinallyブロックは例外をスローし、tryブロックからの例外は抑制されます。

一方、try-with-resourcesステートメントを使用しており、tryブロックとtry-with-resourcesステートメントの両方によって例外がスローされる場合、この場合、try-with-resourcesステートメントからの例外は抑制されます。

@Aaronがすでに上で答えているように、私はあなたを説明しようとしました。それが役に立てば幸い。

ソース: http://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

40
Syed Ali Taqi

これはJava 7以降の新機能です。これがないと、リソースを閉じるfinallyブロックが必要になりますPrintWriter out。したがって、上記のコードは次と同等です。

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

try-with-resourcesステートメント を参照してください

10
Aaron Digulla