Sorun, String.valueOf
yöntemin aşırı yüklenmesi :
Java Spesifikasyon Dili, bu tür durumlarda, en spesifik aşırı yüklemenin seçilmesini zorunlu kılar :
Birden fazla üye yöntemin hem erişilebilir hem de bir yöntem çağrısı için geçerli olması durumunda, çalıştırma zamanı yöntemi gönderimi için tanımlayıcı sağlamak üzere birini seçmek gerekir. Java programlama dili, en özel yöntemin seçildiği kuralı kullanır .
A char[]
eşittir Object
, ancak hepsi Object
bir değildir char[]
. Bu nedenle, char[]
bir daha spesifik daha Object
ve Java dili tarafından belirtildiği gibi, String.valueOf(char[])
aşırı yük bu durumda seçilir.
String.valueOf(char[])
Dizi olmayan olmasını bekler null
ve o zamandan beri null
, bu durumda verilir, daha sonra atar NullPointerException
.
Kolay "düzeltme", bunu null
açıkça Object
aşağıdaki gibi yapmaktır:
System.out.println(String.valueOf((Object) null));
// prints "null"
İlgili sorular
Hikayeden çıkarılacak ders
Birkaç önemli nokta var:
- Etkili Java 2. Sürüm, Madde 41: Aşırı yüklemeyi mantıklı kullanın
- Aşırı yükleyebildiğin için her seferinde yapman gerektiği anlamına gelmez
- Kafa karışıklığına neden olabilirler (özellikle yöntemler çılgınca farklı şeyler yapıyorsa)
- İyi bir IDE kullanarak, derleme zamanında hangi aşırı yüklemenin seçildiğini kontrol edebilirsiniz.
- Eclipse ile, yukarıdaki ifadeye fare hover can ve görüyoruz aslında ,
valueOf(char[])
aşırı yük seçilir!
- Bazen açıkça
null
yayınlamak istersiniz (takip edilecek örnekler)
Ayrıca bakınız
Dökümde null
null
Belirli bir referans türüne açıkça atamanın gerekli olduğu en az iki durum vardır :
- Aşırı yüklemeyi seçmek için (yukarıdaki örnekte verildiği gibi)
- Vermek
null
bir vararg parametresine tek bir argüman olarak
İkincisinin basit bir örneği şudur:
static void vararg(Object... os) {
System.out.println(os.length);
}
O zaman aşağıdakilere sahip olabiliriz:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Ayrıca bakınız
İlgili sorular
null
bu durumda olduğu gibi ), her iki aşırı yüklemenin bu değer açısından aynı şekilde davrandığından emin olun!