SORU
7 EKİM 2010, PERŞEMBE


Boolean değerleri, koşullu operatörler ve autoboxing

Neden bu NullPointerException atmaz

public static void main(String[] args) throws Exception {
    Boolean b = true ? returnsNull() : false; // NPE on this line.
    System.out.println(b);
}

public static Boolean returnsNull() {
    return null;
}

bu olmasa da

public static void main(String[] args) throws Exception {
    Boolean b = true ? null : false;
    System.out.println(b); // null
}

?

Çözüm Boolean.FALSE false mümkün değil null boolean --Kutusuz önlemek için yerine bu arada. Ama asıl soru bu değil. Soruneden? Bu davranış, 2. durumda özellikle teyit İDEA herhangi bir referansları var mı?

CEVAP
7 EKİM 2010, PERŞEMBE


Fark returnsNull() yöntemi açık türü derleme zamanında ifadeler statik yazarak etkiler

E1: `true ? returnsNull() : false` - boolean (auto-unboxing 2nd operand to boolean)

E2: `true ? null : false` - Boolean (autoboxing of 3rd operand to Boolean)

Java Dil Şartnamesi, bkz: Bölüm 31**

  • E1, 2. türleri ve 3. sayılar için Boolean boolean sırasıyla, yani bu madde geçerlidir:

    İkinci ve üçüncü işlenen bir tür boolean ve diğer tür Boolean türünde ise, koşullu ifadenin türü olan boolean.

    İfade türü olduğundan boolean için baskı yapılması gerekir boolean,. Derleyici ekler otomatik kutulama bu tür yapmak için 2 işlenen (returnsNull() dönüş değeri) kodu boolean. Tabii ki bu null çalıştırma sırasında geri gelen NPE neden olur.

  • E2, 2. tip ve 3. sayılar için <special null type> (E1! gibi Boolean) ve boolean sırasıyla, çok özel bir yazım maddesinin (go read 'em!), yani "aksi takdirde" hükmü geçerlidir: . son geçerlidir

    Aksi takdirde, ikinci ve üçüncü işlenen türleri S1 ve S2 sırasıyla. S1 ve T2 izin boks dönüşüm uygulama sonuç türü S2 uygulayarak boks dönüşüm sonucu ortaya çıkan tip olmak T1 izin verin. Koşullu ifade yazın veya (T1, T2 için yakalama dönüştürme (§5.1.10) uygulanması sonucu (§15.12.2.7).

    • S1 == <special null type> (§4.1)
    • S2 == boolean
    • T1 == kutu(S1) = = 24* *(§5.1.7 boks dönüşüm listedeki son maddeye bakın)
    • T2 == kutu(S2) == `Boolean
    • == Boolean veya(T1, T2

    Yani koşullu ifadenin türü Boolean ve 3 işlenen Boolean için baskı yapılması gerekir. Derleyici ekler otomatik-boks 3. işlenen kod (false). 2. işlenen null geri döndüğünde otomatik kutulama hayır yani E1, otomatik kutulama NPE gerek yok.


Bu soruya benzer bir tür ihtiyaç analizi:

Java conditional operator ?: result type

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010
  • Sergio Lafuente Rubio

    Sergio Lafue

    11 Aralık 2008