![](/img/trans.png)
[英]How to rewrite try-with-resources with two resources using only try-catch-finally construction?
[英]Why write Try-With-Resources without Catch or Finally?
为什么像下面的例子那样写 Try without a Catch 或 finally?
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
块并且您的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!
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.