1. ホーム
  2. java

[解決済み] なぜCatchやFinallyを使わずにTry-With-Resourcesを記述するのか?

2022-03-13 03:54:11

質問

次の例のように、CatchやFinallyを付けずに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>");
    }

}

解決方法は?

上記で説明したように、これはJava 7以降の機能です。 try with resources を記述するのを省略できます。 finally で使用されているすべてのリソースをクローズします。 try-block を使用します。で述べたように ドキュメント

java.lang.AutoCloseableを実装したオブジェクト(java.io.Closeableを実装した全てのオブジェクトを含む)は、リソースとして使用することが可能です。

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

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() を明示的に指定します。

ここでもう一つ重要なことに気づかされます は、もしあなたが finally ブロックと tryfinally ブロックが例外をスローした場合、その例外は try ブロックは抑制されます。

一方 try-with-resources 文の両方で例外が発生した場合 try ブロックと try-with-resources ステートメントを使用する場合、このケースでは try-with-resources ステートメントが抑制されます。

上記の@Aaronがすでに回答しているように、私はちょうどあなたを説明しようとしました。お役に立てれば幸いです。

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