次の例のように、キャッチなしで、または最後に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.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
ブロックを自分で書いている場合、そしてあなたのtry
とfinally
ブロックは例外をスローし、try
ブロックからの例外は抑制されます。
一方、try-with-resources
ステートメントを使用しており、try
ブロックとtry-with-resources
ステートメントの両方によって例外がスローされる場合、この場合、try-with-resources
ステートメントからの例外は抑制されます。
@Aaronがすでに上で答えているように、私はあなたを説明しようとしました。それが役に立てば幸い。
ソース: http://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
これは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ステートメント を参照してください