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.
Tôi biết [this] (http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe) . –
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ã –
@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