Tại sao con trỏ null thay vì lớp đúc?


26

Trong Java:

int count = (Integer) null;

ném một java.lang.NullPulumException.

Tại sao điều này không ném Class Cast Exception để dễ hiểu cho lập trình viên?

Tại sao ngoại lệ này được chọn hơn bất kỳ ngoại lệ nào khác?

Câu trả lời:


46

Khi thực thi mã của bạn, thời gian chạy Java thực hiện như sau:

  1. Truyền null cho một đối tượng của lớp Integer.
  2. Cố gắng bỏ hộp đối tượng Integer thành int bằng cách gọi phương thức intValue ()
  3. Gọi một phương thức trên một đối tượng null sẽ ném NullPulumException.

Nói cách khác, null có thể được chuyển thành Integer mà không gặp vấn đề gì, nhưng một đối tượng số nguyên null có thể được chuyển đổi thành giá trị của kiểu int.

CHỈNH SỬA

Tôi đã có một câu hỏi liên quan một lúc trước tại Stack Overflow, xem tại đây .


1

Java chuyển thành công null thành một tham chiếu Integer tham chiếu không có đối tượng.

Điều đó ổn vì không được xác nhận là trạng thái hợp lệ để tham khảo.

Đó là cách gọi phương thức của một đối tượng không tồn tại không thể thực hiện được.

Việc thực hiện ép kiểu (Integer)nullcũng giống như khai báo biến Integer và sau đó không gán cho nó một thể hiện đối tượng Integer mới (hoặc đã tồn tại).


-1

Để unbox a Integerthành một inttức là trong int i = new Integer(15);, ithực sự bằng new Integer(15).intValue() i = (Integer) o; nơi Object o = 15giống như o = Integer.valueOf(15);nhưng i = null; ném một NullPointerExceptionisau đó bằng null.intValue()mà ném a NullPointerException.


2
Câu trả lời đã được chấp nhận gần hai năm trước cung cấp gần như cùng một lời giải thích, nhưng rõ ràng hơn. Câu trả lời này cũng không đúng với Java 5+: hiện tại nó sử dụng các valueOf()phương thức xuất xưởng thay vì tạo các cá thể mới cho quyền anh.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.