Tại sao Double.parseDouble (null) và Integer.parseInt (null) ném ra các ngoại lệ khác nhau?


92

Tại sao Double.parseDouble (null) và Integer.parseInt (null) ném ra các ngoại lệ khác nhau?

Đây là một tai nạn lịch sử hay cố ý? Tài liệu nêu rõ hai loại ngoại lệ cho Double.parseDouble(...)và một cho Integer.parseInt(), nhưng có vẻ không nhất quán:

Integer.parseInt(null); // throws java.lang.NumberFormatException: null

Tuy nhiên

Double.parseDouble(null); // throws java.lang.NullPointerException


2
Kiểm tra mã nguồn của các phương pháp tương ứng, có vẻ như chỉ là một sự không nhất quán. parseDoublekhông thực hiện kiểm tra null và chỉ ném NPE khi nó gặp phải, nhưng trong parseInt, sau đó chuỗi đầu vào được kiểm tra null. Tôi không thể thấy lý do chính đáng nào khiến họ phải cư xử khác.
NilsH

Tôi đã kiểm tra rằng họ ném cùng mộtNumberFormatException.
twlkyao

Câu trả lời:


67

Nó là hợp lý để mong đợi các ngoại lệ tương tự được ném cho null; tuy nhiên, những api này đã rất cũ và có thể không thể thay đổi vào thời điểm này.

Và:

Vì hành vi ngoại lệ đã có từ lâu và được chỉ định trong JavaDoc, nên việc thay đổi hành vi của một trong hai phương thức tại thời điểm này là không thực tế. Đóng cửa như sẽ không sửa chữa.

Như được lấy từ: Báo cáo lỗi: Integer.parseInt () và Double.parseDouble () ném ra các ngoại lệ khác nhau trên null.

Giống như những người khác đã nói: Nó có thể được tạo ra bởi các tác giả khác nhau.


2
Báo cáo lỗi liên quan và thú vị: bug.sun.com/view_bug.do?bug_id=6463998 Có vẻ như trong Java 6, phương thức phân tích cú pháp từ lớp Double / Float ném NPE.
nhahtdh

2
Thật thú vị, bình luận nói rằng chức năng này "rất cũ" vào thời điểm đó, và đó là cách đây 15 năm.
Southpaw Hare

Sự mâu thuẫn này rất có thể bắt nguồn từ Java 1.0. Thật không may, sẽ rất khó để xác minh điều đó. Tôi không nghĩ rằng Java 1.0 có sẵn để tải xuống và bạn sẽ cần một hộp Windows 95 / NT để chạy nó. Hoặc một máy cổ SPARC).
Stephen C

59

Lưu ý: mọi thứ trong bài đăng này là nguồn của Java7-b147

Double.parseDouble()đi vào thư viện Sun (trong sun.misc.FloatingDecimal) điều quan trọng đầu tiên xảy ra là:

in = in.trim(); // don't fool around with white space.
                // throws NullPointerException if null

Integer.parseInt()được thực hiện thủ công trong Integerlớp. Điều quan trọng đầu tiên xảy ra là:

if (s == null) {
    throw new NumberFormatException("null");
}

Tôi đoán có hai tác giả khác nhau.

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.