Bitiştirmek Java dizeleri null
Neden şu işe yarıyor mu? NullPointerException
atılan olmanızı beklerdim.
String s = null;
s = s "hello";
System.out.println(s); // prints "nullhello"
CEVAP
Nedengerekirbu iş?
JLS 8, § 5.1.11 "String Conversion"JLS 5, Section 15.18.1.1 JLS 8 § 15.18.1 "String Concatenation Operator " lider bu işlem hata başarılı gerektirir:
...Şimdi sadece referans değerler olarak kabul edilmesi gerekir.Eğer bu referans null ise, dize dönüştürülür "" . null (dört ASCII karakterler n, u, l, l). Aksi takdirde, dönüşüm yapıldı sanki bir çağrı olabilirdi yöntemi başvurulan bir nesne ile herhangi bir argüman; ama eğer sonuç çağırma yöntemi olabilirdi null, sonra Dize "null" yerine kullanılır.
Nasılişe yarıyor mu?
Bu bayt kodu bakalım! Derleyici kodunuzu alır:
String s = null;
s = s "hello";
System.out.println(s); // prints "nullhello"
ve bayt koduna derler eğer bu yazılı olsaydı yerine:
String s = null;
s = new StringBuilder(String.valueOf(s)).append("hello").toString();
System.out.println(s); // prints "nullhello"
(javap -c
kullanarak kendiniz de yapabilirsiniz)
Ekleme StringBuilder
yöntemleri tüm boş sadece ince kolu. null
ilk tartışma String.valueOf()
çünkü bu durumda StringBuilder olmadığı için yerine çağrılan rasgele herhangi bir başvuru türü götüren bir kurucu.
Bunun yerine s = "hello" s
yapmış olsaydın, eşdeğer kodu şöyle olacaktır:
s = new StringBuilder("hello").append(s).toString();
bu durumda ekleme yöntemi null alırsonratemsilciler 14* *için.
Not:Dize birleştirme aslında derleyici gerçekleştirmek için karar alır ender yerlerden biridir. Gibi," kod derleyici. derleyici farklı olabilir "tam eşdeğer Bu optimizasyon JLS, Section 15.18.1.2 ile izin verilir:
Tekrarlanan dize birleştirme performansını artırmak için bir Java derleyicisi StringBuffer sınıfı veya bir ifadenin değerlendirilmesi ile oluşturulan Ara Dize nesne sayısını azaltmak için benzer bir tekniği kullanabilir.
Belirlemek için kullanılan derleyici "eşdeğer kodu" üzerinde Eclipse derleyiciAvrupa Adalet Divanı.
Java Dize dizisi için ArrayList içeren...
Kaldırma Java dizeleri boşluk...
Neden Java null atabilir miyim?...
Java, bir dize null ve boş olup olmadı...
Son Java ilan eden == ile karşılaştırm...