2012-11-24 26 views
9

thể trùng lặp:
How come invoking a (static) method on a null reference doesn’t throw NullPointerException?
Static fields on a null reference in JavaForce gọi phương thức trên biến null để ném một NullPointerException

Tôi đã thử các mã từ this old video:

class Impossible { 
    public static void main(String[] args) { 
     Thread t = null; 
     System.out.println(t.currentThread().getName()); 
    } 
} 

Output: main

Chà, cái quái gì thế ?! Có java.lang.Thread vi phạm bất kỳ quy tắc NullPointerException nào không?

Nhưng điều tôi quan tâm nhất: Làm cách nào để biến biến đó hoạt động để ném NullPointerException?

+3

Tôi biết [this] (http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe) . –

+2

Nếu bạn muốn cách nhanh nhất để đảm bảo NPE được ném, chỉ cần gọi phương thức '.getClass();'. Có lợi thế là không tăng số lượng chi nhánh trong phạm vi mã –

+0

@RefLibApi Vì vậy, bạn biết nó không thể ném một NPE nhưng đang yêu cầu làm thế nào để ném một NPE ... Không chắc chắn tôi theo bạn. – assylias

Trả lời

10

Có phải java.lang.Thread vi phạm quy tắc NullPointerException không?

Không, lý do cho một NPE được ném không liên quan đến một class. Nó liên quan đến một số instance của lớp đó, trên đó yêu cầu được thực hiện. Ngoài ra, nó phụ thuộc vào loại phương thức, hoặc trường bạn đang truy cập.

Điều đang xảy ra ở đây là, currentThread() là phương pháp tĩnh của lớp Thread. Đó là boudn cho một lớp, chứ không phải là một thể hiện. Vì vậy, ngay cả khi bạn gọi nó trên một tham chiếu của lớp Thread, nó thực sự được gọi trên tên lớp.

Vì vậy,

Thread t = null 
t.currentThread(); 

là thực sự gọi là: -

Thread.currentThread(); 

Vì vậy, khi truy cập vào một thành viên tĩnh thông qua một biểu tham chiếu đối tượng, chỉ có kiểu tuyên bố của các vấn đề tham khảo. Điều này có nghĩa là:

  • Nó không quan trọng nếu tham chiếu thực sự trỏ đến null, vì không cần trường hợp.

  • Nếu tham chiếu không rỗng, không quan trọng loại của đối tượng tham chiếu trỏ đến, không có công văn động.


Làm thế nào tôi có thể làm cho rằng biến cư xử để ném một NullPointerException?

Vâng, câu lệnh in hiện tại sẽ không bao giờ ném NPE. Phần đầu tiên đã được giải thích ở trên. Bây giờ, chúng ta hãy tiến lên phía trước.

Thread.currentThread(); 

Lệnh gọi trên sẽ không bao giờ trả về null. Nó luôn trả về cá thể luồng hiện tại. Và trong Java, bạn luôn ở bên trong một hoặc chủ đề khác. Ngay cả khi bên trong phương thức public static void main, bạn đang thực hiện Main Thread. Vì vậy, currentThread không thể là null.

Và vì thế, tiếp tục gọi: -

Thread.currentThread().getName(); 

sẽ làm việc tốt, và trả lại tên của thread hiện hành.

+0

Được rồi, phần thứ hai đã làm rõ cho tôi, cảm ơn. = ( –

+0

@RefLibApi .. Tôi nghĩ đó là điều có thể gây nhầm lẫn cho bạn. Bạn được chào đón :) –

3

currentThread() là phương thức static của lớp Thread. Điều này có nghĩa là nó không liên kết với bất kỳ cá thể cụ thể nào của lớp, mà với chính lớp đó.

Với điều này trong tâm trí, t.currentThread() chỉ đơn giản là một cách khác để nói Thread.currentThread(). Giá trị của t không được sử dụng ở tất cả, vì vậy nó không quan trọng cho dù tnull.

0

Nếu bạn thấy mã mà bên env phát triển của bạn (Eclipse/Netbeans) bạn đã có thể nhìn thấy ở khoảnh khắc đầu tiên mà currentThread() được viết bằng chữ thảo, cho biết rõ ràng rằng đó là một phương pháp tĩnh (Phương thức lớp).

Hơn nữa, nếu bạn đã bật kiểu kiểm tra, nó sẽ cảnh báo bạn không gọi phương thức tĩnh trên các phiên bản của đối tượng.

Câu hỏi có một chút Lỗi, vì định dạng Mã ở đây không thể hiển thị các phương thức tĩnh được định dạng khác.

Và cuối cùng trả lời câu hỏi: Chủ đề lớp không bao giờ rỗng, các phiên bản của một lớp có thể là rỗng.

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