为什么写Try尝试没有Catch或者最后?

Uma*_*hmi 31 java try-with-resources

为什么在没有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>");
    }

}
Run Code Online (Sandbox Code Playgroud)

Sye*_*aqi 41

如上所述,这是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();
}
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,资源是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

  • 所以它类似于C#的使用和IDisposable的. (3认同)
  • @roufamatic是的,类似的,尽管最大的区别是C#的“using”不以任何方式防止异常,它只是保证在块末尾的资源关闭。在 C# 中,您通常必须将“using”块与“try”块结合起来。Java 的“try-with-resources”一起执行此操作。 (2认同)

Aar*_*lla 10

这是Java 7及更高版本中的新功能.没有这个,你需要一个finally关闭资源的块PrintWriter out.所以上面的代码相当于:

PrintWriter out = null;
try {
    PrintWriter out = ...
} finally {
    if(null != out) {
        try {
            out.close();
        } catch(Exception e) {} // silently ignore!
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅try-with-resources语句

  • 它们并不等同。如果 try 和 finally 块都抛出异常,则 try 块中的异常将被 try-and-catch 抑制。另一方面,如果使用 try-with-resources 语句,finally 块中的异常(自动关闭抛出异常)将被抑制。 (2认同)