2013-04-09 30 views
33

Hãy sửa tôi nếu điều này sai: Trong câu lệnh try-with-resources của Java 7, bất kỳ ngoại lệ nào được ném bởi phương thức của tài nguyên close() phải được khai báo theo phương pháp của tôi hoặc tôi phải thử toàn bộ một lần thử khác try ngoại lệ được ném bởi close().Thử-với-tài nguyên: Tôi có phải ném hoặc nắm bắt các ngoại lệ của phương thức close() không?

Nếu vậy, tôi phải tự hỏi liệu tôi có sử dụng nhiều hay không. Tôi chắc chắn không muốn throw ngoại lệ được ném bởi close(), người gọi sẽ không biết phải làm gì với điều đó. Và try gói thêm try chỉ để xử lý close() sẽ không trông rất tao nhã, với tôi ít nhất.

EDIT: Tôi nghĩ rằng tôi vô tình hỏi hai câu hỏi, một trong số đó là một bản sao.

Câu hỏi 1. Tôi có phải tuyên bố rằng phương pháp của tôi đưa ra ngoại lệ từ phương pháp close() hoặc quấn thử bằng tài nguyên trong lần thử khác không? (Không được trả lời trong bản sao được đề xuất.)

Câu hỏi 2. Có cách nào để đóng tài nguyên một cách âm thầm không? (Rõ ràng là một bản sao, vì vậy tôi đang dùng câu nói đó ra câu hỏi. Hy vọng rằng điều này làm cho các câu hỏi một cách thỏa đáng độc đáo.)

+0

Bạn có rất nhiều tài nguyên mà ném từ 'close()'? –

+0

Chỉ một vài, nhưng tôi sử dụng chúng rất nhiều (ResultSet, BufferedReader, RandomAccessFile). –

Trả lời

26

Trích từ Java Language Specification ($14.20.3.2):

14.20.3.2 mở rộng thử-với-nguồn

Một try-với-nguồn tuyên bố có ít nhất một mệnh đề catch và/hoặc cuối cùng mệnh đề được gọi là câu lệnh try-with-resources mở rộng. Ý nghĩa của một câu lệnh mở rộng thử-với-nguồn:

        thử ResourceSpecification
                Khối
        Catchesopt
        Cuối cùngopt

được đưa ra bởi các dịch sau để một cơ bản try-với-nguồn tuyên bố (§14.20.3.1) lồng vào bên trong một try-catch hoặc thử cuối cùng hoặc try-catch-finally tuyên bố:

        try {
                thử ResourceSpecification
                        Khối
       }
        Catchesopt
        Cuối cùngopt

Hiệu quả của bản dịch là đặt phần xác định tài nguyên "bên trong" câu lệnh try . Điều này cho phép điều khoản bắt của câu lệnh mở rộng thử với tài nguyên để bắt ngoại lệ do khởi tạo tự động hoặc đóng bất kỳ tài nguyên nào.

Vì vậy, về cơ bản, bao bọc đã được thực hiện

18

Từ the Java tutorial

Một câu lệnh try-với-các nguồn lực có thể có khối catch và cuối cùng giống như một tuyên bố thử thông thường. Trong một tuyên bố cố gắng với nguồn lực, bất kỳ bắt hoặc chặn cuối cùng nào được chạy sau khi các tài nguyên được khai báo đã bị đóng.

(tôi nhấn mạnh)

Vì vậy, bạn chỉ có thể làm

try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 
catch (IOException e) { 
    // handle the exception that has been thrown by readLine() OR by close(). 
} 
+0

tài nguyên sẽ bị đóng nếu nó không gọi bắt và không có khối cuối cùng? –

+0

Nhấp vào liên kết và đọc. –

6

Bạn không cần phải quấn nguồn try-với-trong một khối try-catch, bạn chỉ cần thêm một nắm bắt block:

class Foo implements AutoCloseable { 
    public void close() throws Exception { 
     throw new Exception(); 
    } 
} 

public class Try { 
    public static void main(final String[] args) { 
     try(Foo f = new Foo()) { 
      System.out.println("No op!"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
1

Bạn có thể chỉ cần thêm mệnh đề catch (Exception e) { } thích hợp. Nếu bạn cần phải xử lý đặc biệt cho một cái cụ thể, hoặc bạn có thể chỉ cần bắt Exception, nếu bạn cần nó rộng hơn nhiều.

try (Statement stmt = con.createStatement()) { 
    ResultSet rs = stmt.executeQuery(query); 

    while (rs.next()) { 
     String coffeeName = rs.getString("COF_NAME"); 
     int supplierID = rs.getInt("SUP_ID"); 
     float price = rs.getFloat("PRICE"); 

     System.out.println(coffeeName + ", " + supplierID + ", " + 
          price + ", " + sales + ", " + total); 
    } 
} catch (Exception e) { 
    System.out.println("Exception while trying to through the queries. ", e); 
} 

Vì nó là Java 7, bạn thực sự có thể đặt nhiều ngoại lệ cho mỗi điều khoản bắt hoặc bạn có thể chỉ cần nắm bắt ngoại lệ ngoài cùng bạn muốn.

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