SORU
28 HAZİRAN 2010, PAZARTESİ


Neden String yapar.değerini(null) bir NullPointerException at?

belgelere göre, yöntemi String.valueOf(Object obj) verir:

eğer argüman null, sonra bir dize "null"; aksi halde eşit ise, obj.toString() değeri döndürülür.

Ama nasıl gel çalıştığımda bu

System.out.println("String.valueOf(null) = "   String.valueOf(null));

NPE yerine atar? (eğer inanmıyorsun diye kendiniz deneyin!)

    Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.(Unknown Source)
    at java.lang.String.valueOf(Unknown Source)

Peki, bu nasıl oluyor? Bu belgeler yalan mı? Bu Java büyük bir hata mı?

CEVAP
28 HAZİRAN 2010, PAZARTESİ


Sorun String.valueOf yöntem olmasıdıraşırı yüklü:

Durumlarda bu tür, Şartname Dili Zorunlu Javaen özel aşırı yükseçilmiş:

JLS 15.12.2.5 Choosing the Most Specific Method

Eğer birden fazla üye metod ve Yöntem çağırma için de erişilebilir ve Uygulanabilir ise, çalışma zamanı yöntemi tanımlayıcı gönderme sağlamak için birini seçmek için gereklidir. Java programlama dili kuralı kullanıren özelyöntem seçilir.

13**-birObject ama tüm Object-birchar[]. Bu nedenle, char[]daha özelJava dili tarafından belirtilen Object, ve, String.valueOf(char[]) aşırı bu durumda seçilir.

String.valueOf(char[]) dizi olmayannull, olmasını bekler ve null bu durumda verilen bu yana, o zaman NullPointerException atar.

Kolay "düzeltme" şöyle: null açıkça 25 ** dökme

System.out.println(String.valueOf((Object) null));
// prints "null"

İlgili sorular


Hikayenin ahlaki

Birkaç önemli olanları vardır:

  • Etkili Java 2. Baskı, Madde 41: Kullanmak mantıklı . aşırı yükleme
    • Aşırı yüklenmeye neden olabilir diye, yapman gerektiği anlamına gelmez her zaman
    • Karışıklık özellikle yöntemlerden oldukça farklı şeyler yaparsanız () neden olabilir
  • İyi IDE kullanarak, derleme zamanında seçili olan kontrol edebilirsiniz
    • Güneş Tutulması ile, Fare hover yukarıda ifade ve görebilirsinizgerçekten, valueOf(char[]) aşırı seçilir!
  • Bazen açıkça null (takip edilecek örnekler) döküm

Ayrıca Bkz


null döküm

Açıkça belirli bir başvuru türü için null döküm gerekli olan en az iki durum vardır:

  • Aşırı yükleme için seçin örnek yukarıda verilen gibi)
  • Sırasında bir parametre için tek bir değişken olarak null vermek

İkincisi basit bir örnek şudur:

static void vararg(Object... os) {
    System.out.println(os.length);
}

Sonra şunları yapabiliriz:

vararg(null, null, null); // prints "3"
vararg(null, null);       // prints "2"
vararg(null);             // throws NullPointerException!

vararg((Object) null);    // prints "1"

Ayrıca Bkz

İlgili sorular

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • John Lynn

    John Lynn

    8 Ocak 2010
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006
  • metallmanutza13

    metallmanutz

    13 NİSAN 2007