2014-10-14 13 views
12

Tại sao viết thử mà không cần bắt hoặc cuối cùng như trong ví dụ sau?Tại sao viết thử mà không cần bắt hoặc cuối cùng?

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>"); 
    } 

} 
+6

đọc về thử với nguồn lực (Java 7) – Eran

+7

Xem [Hãy thử với nguồn] (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) – Justin

+0

Bản sao của "Làm cho nó có ý nghĩa để làm" cố gắng cuối cùng "mà không" bắt "?" – Juru

Trả lời

17

Như đã giải thích ở trên đây là một tính năng trong Java 7 và xa hơn nữa. try with resources cho phép bỏ qua việc viết finally và đóng tất cả các tài nguyên đang được sử dụng trong chính bản thân số try-block. Như đã nêu trong Docs

Bất kỳ đối tượng nào thực hiện java.lang.AutoCloseable, có thể được sử dụng làm tài nguyên.

Xem mã này dụ

static String readFirstLineFromFile(String path) throws IOException { 
try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 
} 

Trong ví dụ này tài nguyên là BufferReader đối tượng như lớp cài đặt giao diện java.lang.AutoCloseable và nó sẽ đóng cửa cho dù các khối try thực hiện thành công hay không có nghĩa là bạn đã thắng không phải viết br.close() một cách rõ ràng.

Một điều quan trọng cần lưu ý ở đây là nếu bạn đang viết các finally chặn bản thân và cả tryfinally khối ném ngoại lệ của bạn sau đó ngoại trừ từ try khối được supressed.

Trong khi trên Mặt khác, nếu bạn đang sử dụng try-with-resources tuyên bố và ngoại lệ được ném ra bởi cả hai try khối và try-with-resources tuyên bố sau đó trong trường hợp này ngoại trừ từ try-with-resources tuyên bố là bị đàn áp.

Vì @Aaron đã trả lời ở trên, tôi vừa cố giải thích cho bạn. Hy vọng nó giúp.

Nguồn: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

+1

Vì vậy, nó tương tự như của C# sử dụng & IDisposable của. – roufamatic

7

Đây là tính năng mới trong Java 7 trở lên. Nếu không có điều này, bạn cần một khối finally đóng tài nguyên PrintWriter out. Vì vậy, các mã trên tương đương với:

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

Xem The try-with-resources Statement

+0

Chúng không tương đương. Nếu ngoại lệ ném từ cả hai cố gắng và cuối cùng khối, ngoại lệ từ khối thử sẽ bị đàn áp với try-and-catch. Mặt khác, nếu bạn sử dụng câu lệnh try-with-resources, ngoại lệ từ cuối cùng là block (auto close throws exception) sẽ bị loại bỏ. – Nier

+0

@Nier Cố định phần cuối cùng. –

Các vấn đề liên quan