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


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.