繁体   English   中英

为什么要在没有 Catch 或 finally 的情况下编写 Try-With-Resources?

[英]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块并且您的tryfinally块都抛出异常,那么来自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 声明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM