为什么在没有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>");
}
}
答案 0 :(得分:37)
如上所述,这是Java 7及更高版本中的一项功能。 try with resources
允许跳过编写finally
并关闭try-block
本身使用的所有资源。如Docs
任何实现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
块,并且try
和finally
块抛出异常,那么异常从try
区块被压制。
另一方面,如果您正在使用try-with-resources
语句,并且try
块和try-with-resources
语句都会引发异常,那么在这种情况下,来自try-with-resources
语句的异常被抑制了。
@Aaron已在上面回答过,我试着解释一下。希望它有所帮助。
来源:http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
答案 1 :(得分:10)
这是Java 7及更高版本中的新功能。如果没有这个,您需要一个关闭资源finally
的{{1}}块。所以上面的代码相当于:
PrintWriter out