53

为什么要写 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>");
    }

}
4

2 回答 2

66

如上所述,这是 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

于 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 回答