2016-02-12 16 views
15

Tính năng thử làm việc với các biến số AutoCloseable đã được khai báo null như thế nào?Try-With Resource khi AutoCloseable is null

tôi cho rằng điều này sẽ dẫn đến một con trỏ ngoại lệ null khi nó cố gắng để gọi close trên biến, nhưng nó chạy không có vấn đề:

try (BufferedReader br = null){ 
    System.out.println("Test"); 
} 
catch (IOException e){ 
    e.printStackTrace(); 
} 

Trả lời

22

Java Language Specification xác định rằng nó được đóng lại chỉ khi phi null, trong phần 14.20.3. try-with-resources:

Tài nguyên chỉ được đóng nếu nó được khởi tạo thành giá trị không null.

Điều này thực sự hữu ích khi tài nguyên có thể hiển thị đôi khi và những người khác vắng mặt.

Ví dụ: giả sử bạn có thể hoặc không thể có proxy có thể đóng được đối với một số hệ thống ghi nhật ký từ xa.

try (IRemoteLogger remoteLogger = getRemoteLoggerMaybe()) { 
    if (null != remoteLogger) { 
     ... 
    } 
} 

Nếu tham chiếu không rỗng, proxy bộ ghi từ xa sẽ đóng, như chúng tôi mong đợi. Nhưng nếu tham chiếu là null, không có cố gắng được thực hiện để gọi close() trên nó, không có NullPointerException được ném, và mã vẫn hoạt động.

+1

Haha, trường hợp sử dụng bạn vừa thêm là điều khiến tôi đặt câu hỏi ngay từ đầu! Cảm ơn! – flakes

+0

Không đời nào! Đó là hoang dã. Tôi chỉ làm nó lên. –

+0

Vâng. các loại biến khác nhau, nhưng cấu trúc tương tự: p – flakes

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