2016-06-07 34 views
9

Có lý do nào để tạo tham chiếu phương thức trên tham chiếu null trong Java không? Việc làm này có lẽ là không bao giờ đúng nhưng có thể dẫn đến sai sót đó là khó có thể tìm thấy sau:Tạo tham chiếu phương thức trên tham chiếu null không ném ngoại lệ

public class Test { 
    void m() { 
    } 

    public static void main(String[] args) { 
     Test test = null; 
     Runnable fn = test::m; // no exception 
     System.out.println(fn); // prints Test$$Lambda$1/[email protected] 
     fn.run(); // throws a null pointer exception 
    } 
} 
+5

Bạn đang thử nghiệm với Eclipse? Tôi đã thử nghiệm với JDK 1.8.0_51 và nó ném NPE, nơi dự kiến. Điều này có thể trả lời câu hỏi sau đó http://stackoverflow.com/questions/37413106/thread-setuncaughtexceptionhandler-and-java-8-method-reference/. Bởi vì nó nên ném một NPE tại 'Runnable fn = test :: m'. – Tunaki

+0

Tôi đang bỏ phiếu để đóng câu hỏi này là không có chủ đề vì nó hỏi về hành vi không tồn tại. –

+0

@Tunaki yes Tôi đã thử nghiệm trong Eclipse và nó không ném một ngoại lệ khi tôi bỏ ghi chú dòng cuối cùng – Michael

Trả lời

11

Có một lý do tại sao người ta có thể tạo ra tài liệu tham khảo phương pháp trên một tài liệu tham khảo null trong Java?

Nó không phải là, nhưng dường như có một lỗi trong Eclipse trong lĩnh vực này (chỉnh sửa: trong đó có kể từ been fixed). Theo đặc điểm kỹ thuật, và khi bạn sử dụng các công cụ của JDK, nó không thành công với một NPE trên dòng Runnable fn = test::m;.

Proof: http://ideone.com/APWXna (hoặc biên dịch và chạy nó tại địa phương với javacjava hơn là Eclipse)

Lý thuyết: Từ JLS §15.13.3:

Thứ nhất, nếu biểu thức phương pháp tham khảo bắt đầu với một ExpressionName hoặc Chính, biểu thức con này được đánh giá. Nếu biểu thức con đánh giá là null, một NullPointerException được nâng lên và biểu thức tham chiếu phương thức hoàn thành đột ngột.

(nhấn mạnh của tôi.)

+0

Lỗi này có được báo cáo cho Eclipse không? –

+1

@DidierL: Tôi không biết, tôi không sử dụng Eclipse. –

+1

Sự cố này đã được giải quyết trong https://bugs.eclipse.org/bugs/show_bug.cgi?id=521182 – bjmi

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