Mengapa Double.parseDouble (null) dan Integer.parseInt (null) memunculkan pengecualian yang berbeda?

92

Mengapa Double.parseDouble (null) dan Integer.parseInt (null) memunculkan pengecualian yang berbeda?

Apakah ini kecelakaan bersejarah atau disengaja? Dokumentasi dengan jelas menyatakan dua jenis pengecualian untuk Double.parseDouble(...)dan satu untuk Integer.parseInt(), tetapi tampaknya tidak konsisten:

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

Namun

Double.parseDouble(null); // throws java.lang.NullPointerException
pho79.dll
sumber
2
@Aquillo: Ada docs.oracle.com/javase/tutorial/java/nutsandbolts/…double primitif
nhahtdh
2
Memeriksa kode sumber dari masing-masing metode, sepertinya hanya inkonsistensi. parseDoubletidak melakukan pemeriksaan null, dan hanya melempar NPE ketika ditemukan, tetapi masuk parseInt, maka string masukan akan diperiksa null. Saya tidak dapat melihat alasan yang bagus mengapa mereka harus berperilaku berbeda.
NilsH
Saya telah memeriksa bahwa mereka melempar sameNumberFormatException.
twlkyao

Jawaban:

67

Masuk akal untuk mengharapkan pengecualian yang sama diberikan untuk null; namun, api ini sudah sangat tua dan mungkin tidak dapat diubah pada saat ini.

Dan:

Karena perilaku pengecualian sudah lama dan ditentukan di JavaDoc, tidak praktis untuk mengubah perilaku metode mana pun saat ini. Menutup karena tidak akan diperbaiki.

Seperti yang diambil dari: Bug Report: Integer.parseInt () dan Double.parseDouble () memberikan pengecualian berbeda pada null.

Seperti yang dikatakan orang lain: Kemungkinan dibuat oleh penulis yang berbeda.

Floris Velleman
sumber
2
Laporan bug terkait dan menarik: bugs.sun.com/view_bug.do?bug_id=6463998 Sepertinya di Java 6, metode parse dari kelas Double / Float melempar NPE.
nhahtdh
2
Yang mengherankan, komentar tersebut mengatakan bahwa fungsi ini "sangat tua" pada saat itu, dan itu sudah 15 tahun yang lalu.
Southpaw Hare
Inkonsistensi ini kemungkinan besar berasal dari Java 1.0. Sayangnya, akan sulit untuk memverifikasi itu. Saya tidak berpikir Java 1.0 tersedia untuk diunduh, dan Anda memerlukan kotak Windows 95 / NT untuk menjalankannya. Atau mesin SPARC kuno.)
Stephen C
59

Catatan: semua yang ada di posting ini ada di sumber Java7-b147

Double.parseDouble()masuk ke perpustakaan Sun (dalam sun.misc.FloatingDecimal) hal penting pertama yang terjadi adalah:

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

Integer.parseInt()dilakukan secara manual di Integerkelas. Hal penting pertama yang terjadi adalah:

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

Saya rasa ada dua penulis yang berbeda.

durron597
sumber