Kode berikut melempar NullPointerException
:
int num = Integer.getInteger("123");
Apakah kompiler saya menggunakan getInteger
null karena statis? Itu tidak masuk akal!
Apa yang terjadi?
java
integer
nullpointerexception
api-design
autoboxing
pengguna282886
sumber
sumber
Jawaban:
Gambar besar
Ada dua masalah yang berperan di sini:
Integer getInteger(String)
tidak melakukan apa yang menurut Anda dilakukannyanull
dalam kasus iniInteger
menjadiint
menyebabkan unboxing otomatisInteger
itunull
,NullPointerException
dibuangUntuk mengurai
(String) "123"
untuk(int) 123
, Anda dapat menggunakan misalnyaint Integer.parseInt(String)
.Referensi
Integer
Referensi APIstatic int parseInt(String)
static Integer getInteger(String)
Di
Integer.getInteger
Inilah yang dikatakan dokumentasi tentang apa yang dilakukan metode ini:
Dengan kata lain, metode ini tidak ada hubungannya dengan parsing a
String
keint/Integer
nilai, melainkan berkaitan denganSystem.getProperty
metode.Memang ini bisa menjadi kejutan. Sangat disayangkan bahwa perpustakaan memiliki kejutan seperti ini, tetapi hal itu memberi Anda pelajaran berharga: selalu cari dokumentasi untuk mengonfirmasi apa yang dilakukan suatu metode.
Secara kebetulan, variasi dari masalah ini ditampilkan dalam Return of the Puzzlers: Schlock and Awe (TS-5186) , presentasi JavaOne Technical Session 2009 dari Josh Bloch dan Neal Gafter. Inilah slide penutupnya:
Untuk kelengkapannya, ada juga cara yang dianalogikan sebagai berikut
Integer.getInteger
:Boolean.getBoolean(String)
Long.getLong(String)
Pertanyaan-pertanyaan Terkait
Tentang autounboxing
Masalah lainnya, tentu saja, adalah bagaimana hal
NullPointerException
itu dilemparkan. Untuk fokus pada masalah ini, kita dapat menyederhanakan cuplikan sebagai berikut:Berikut kutipan dari Effective Java 2nd Edition, Item 49: Lebih suka tipe primitif daripada primitif berkotak:
Ada tempat di mana Anda tidak punya pilihan selain menggunakan primitif dalam kotak, misalnya obat generik, tetapi sebaliknya Anda harus secara serius mempertimbangkan apakah keputusan untuk menggunakan primitif dalam kotak dapat dibenarkan.
Pertanyaan-pertanyaan Terkait
sumber
Integer.getInteger(s)
kira-kira setara denganInteger.parseInt(System.getProperty(s))
? Saya rasa saya lebih suka yang kedua, meskipun lebih bertele-tele, karena menyoroti fakta bahwa Anda menarik informasi dari properti sistem.Integer.decode
bukanInteger.parseInt
, yang terlihat untuk memimpin0x
atau0
untuk mengurai nomor sebagai heksadesimal atau oktal, masing-masing.NullPointerException
? : programmers.stackexchange.com/questions/158908/…Dari http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
Kamu mau ini:
sumber
Silakan periksa dokumentasi metode getInteger () . Dalam metode ini,
String
parameter adalah properti sistem yang menentukan nilai integer dari properti sistem dengan nama yang ditentukan. "123" bukanlah nama properti sistem apa pun, seperti yang dibahas di sini . Jika Anda ingin mengubah String ini menjadiint
, gunakan metode sebagaiint num = Integer.parseInt("123")
.sumber