Masalahnya adalah bahwa String.valueOf
metode kelebihan beban :
Java Spesifikasi Bahasa mengamanatkan bahwa dalam kasus-kasus semacam ini, kelebihan yang paling spesifik dipilih:
Jika lebih dari satu metode anggota dapat diakses dan berlaku untuk pemanggilan metode, perlu memilih satu untuk memberikan deskriptor untuk pengiriman metode run-time. Bahasa pemrograman Java menggunakan aturan bahwa metode yang paling spesifik dipilih.
A char[]
adalah-an Object
, tetapi tidak semua Object
is-a char[]
. Oleh karena itu, char[]
adalah lebih spesifik dari Object
, dan seperti yang ditentukan oleh bahasa Jawa, String.valueOf(char[])
kelebihan dipilih dalam kasus ini.
String.valueOf(char[])
mengharapkan array menjadi non- null
, dan karena null
diberikan dalam kasus ini, ia kemudian melempar NullPointerException
.
"Perbaikan" yang mudah adalah dengan melemparkan null
secara eksplisit ke Object
sebagai berikut:
System.out.println(String.valueOf((Object) null));
// prints "null"
Pertanyaan-pertanyaan Terkait
Pesan moral dalam cerita
Ada beberapa yang penting:
- Java Edisi 2 yang Efektif, Butir 41: Gunakan kelebihan muatan dengan bijaksana
- Hanya karena Anda bisa kelebihan, bukan berarti Anda harus setiap saat
- Mereka dapat menyebabkan kebingungan (terutama jika metode melakukan hal-hal yang sangat berbeda)
- Menggunakan IDE yang baik, Anda dapat memeriksa kelebihan beban yang dipilih pada waktu kompilasi
- Dengan Eclipse, Anda dapat mengarahkan mouse ke ekspresi di atas dan melihat memang ,
valueOf(char[])
kelebihan dipilih!
- Terkadang Anda ingin memberikan secara eksplisit
null
(contoh untuk diikuti)
Lihat juga
Saat casting null
Setidaknya ada dua situasi di mana secara eksplisit casting null
ke tipe referensi tertentu diperlukan:
- Untuk memilih kelebihan beban (seperti yang diberikan dalam contoh di atas)
- Untuk memberikan
null
sebagai argumen tunggal ke parameter vararg
Contoh sederhana dari yang terakhir adalah sebagai berikut:
static void vararg(Object... os) {
System.out.println(os.length);
}
Kemudian, kita dapat memiliki yang berikut ini:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Lihat juga
Pertanyaan-pertanyaan Terkait
null
dalam kasus ini), pastikan bahwa kedua kelebihan tersebut bertindak sama terkait dengan nilai itu!String.valueOf(Object)
danvalueOf(char[])
melakukan hal-hal yang sama sekali berbeda (terlepas darinull
atau tidak) bahwa mungkin mereka seharusnya tidak kelebihan beban di tempat pertama.return null;
akan sama persis denganreturn (Object) null;
?Masalahnya adalah Anda menelepon
String.valueOf(char[])
dan tidakString.valueOf(Object)
.Alasannya adalah bahwa Java akan selalu memilih versi paling spesifik dari metode kelebihan beban yang bekerja dengan parameter yang disediakan.
null
adalah nilai yang valid untuk suatuObject
parameter, tetapi juga nilai yang valid untuk suatuchar[]
parameter.Untuk membuat Java menggunakan
Object
versi, baik lewatnull
variabel atau tentukan gips eksplisit ke Object:sumber
Bug, bernomor 4867608 diajukan dengan cara ini pada tahun 2003, yang diselesaikan sebagai "tidak akan diperbaiki" dengan penjelasan ini.
sumber
Gunakan
String.valueOf(null: Any)
di Scala.sumber