53

次の例のように、Try without a Catch または Final と書くのはなぜですか?

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

}
4

2 に答える 2

66

上で説明したように、これは Java 7 以降の機能です。try with resourcesの書き込みをスキップし、それ自体finallyで使用されているすべてのリソースを閉じます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();
    }
}

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

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

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

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

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

于 2014-10-14T17:20:26.843 に答える
13

これは、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 ステートメントを参照してください

于 2014-10-14T09:16:53.923 に答える