SORU
5 EYLÜL 2013, PERŞEMBE


Neden bu bir NullPointerException atma değil mi?

Aşağıdaki davranış, lütfen kod için aşağıda bak: konusunda karışıklık var

StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample.append("B");
System.out.println(sample);

Bu sample referToSample kanıtlıyor baskı B böylece nesneleri aynı bellek Klavuza bakınız.

StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
sample.append("A");
referToSample.append("B");
System.out.println(referToSample);

Bu da kanıtlıyor AB Yazdır.

StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
referToSample.append("A");
System.out.println(sample);

Belli ki bu bir null başvuru append aramak için çalışıyorum çünkü NullPointerException atmak olacaktır.

StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
sample.append("A");
System.out.println(sample);

Yani Burada benim soru: neden son kod örneği değil atma NullPointerException çünkü ne ben görmek ve anlamak gelen ilk iki örnek ise iki nesne başvuran için aynı nesne daha sonra eğer değiştirirsek herhangi bir değer sonra da yansıtmak için diğer çünkü hem işaret için aynı bellek referans. Neden bu kuralı uyguluyor? Eğer null referToSample ben atarsanız örnek de boş olmalıdır ve bir NullPointerException atmak gerekir ama tek atma değildir, neden?

CEVAP
5 EYLÜL 2013, PERŞEMBE


null ödevler değiştirmeyindeğergenel olarak bu nesne yok. Bu tür bir davranışa zor parça böcek ve mantığa aykırı davranışa neden olur. Onlar sadece belirli molabaşvuru.

Basitlik için, hadi sample 12345 adresi işaret yok. Muhtemelen bu adres değil, ve sadece işleri kolaylaştırmak için burada kullanılır.Adresgenelliklegarip onaltılık Object#hashCode(), verilen ile temsil ama bu uygulama bağımlıdır.1

StringBuilder sample = new StringBuilder(); //sample refers to 
//StringBuilder at 12345 

StringBuilder referToSample = sample; //referToSample refers to 
//the same StringBuilder at 12345 
//SEE DIAGRAM 1

referToSample = null; //referToSample NOW refers to 00000, 
//so accessing it will throw a NPE. 
//The other reference is not affected.
//SEE DIAGRAM 2

sample.append("A"); //sample STILL refers to the same StringBuilder at 12345 
System.out.println(sample);

Çizgiler See diagram işaretli o zaman nesnelerin diyagramları aşağıdaki gibidir:

Diyagram 1:

[StringBuilder sample]    -----------------> [java.lang.StringBuilder@00012345]
                                                      ↑
[StringBuilder referToSample] ------------------------/

Şekil 2:

[StringBuilder sample]    -----------------> [java.lang.StringBuilder@00012345]

[StringBuilder referToSample] ---->> [null pointer]

Diyagramı 2 referToSample iptal 00012345 StringBuilder sample referans kırmak değil gösterir.

1GC konuları bu mantıksız olun.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Flohoo

    Flohoo

    12 EYLÜL 2009
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008
  • TV nEW

    TV nEW

    25 AĞUSTOS 2012