2015-01-27 24 views
8

Aşağıdakiler neden bir NullPointerException? :NullPointerException yöntemi döndürme türü Object

public static Object myTest() { 
    boolean x = false; 
    boolean y = false; 
    return x && y ? new Object() : x ? x : y ? y : null; 
} 

public static void main(String [ ] args) { 
    myTest(); 
} 

i kodunu izleyen bir NullPointerException atmaz birini yaparsanız biliyorum:

A)

public static Object myTest() { 
    boolean x = false; 
    boolean y = false; 
    return x && y ? new Object() : x ? x : y ? y : (Object) null; 
} 

public static void main(String [ ] args) { 
    myTest(); 
} 

B)

public static Object myTest() { 
    Boolean x = false; 
    Boolean y = false; 
    return x && y ? new Object() : x ? x : y ? y : null; 
} 

public static void main(String [ ] args) { 
    myTest(); 
} 

Ayrıca, cod değiştirirseniz e tamamen ve aşağıdakileri yapın çalışır:

public static Object myTest() { 
    boolean x = false; 
    boolean y = false; 

    if(x && y) { 
     return new Object(); 
    } else if(x) { 
     return x; 
    } else if(y) { 
     return y; 
    } else { 
     return null; 
    } 
} 

public static void main(String [ ] args) { 
    myTest(); 
} 

Ben derleyici şeyler çıkmasını nasılsa bir optimizasyon çeşit yapıyor ve sanırım? Bir çeşit bir döküm problemi olduğunu farz ediyorum, ama neden bir ClassCastException yerine bir NullPointerException atar? Bunun neden olduğuna dair herhangi bir bilgi büyük ölçüde takdir edilecektir! peşin

+0

NullPointerException çünkü o godawful karışıklık bir yerde bir null pointer var. –

+0

Başlangıçta düşündüğüm budur ama bence bakmaya değer, bu yüzden +1 – Bathsheba

+0

@laune, bir 'NullPointerException' atar. –

cevap

6

yılında

teşekkürler okunabilirlik için bazı parantez eklerseniz:

return (x && y) ? (new Object()) : (x ? x : (y ? y : null)); 
, derleyici neden (tip eşleşecek şekilde) null Unbox dener Sen y ? y : null de görebilirsiniz

bir NPE atılacak.

+2

tamamlamak için: "y: null" türü, sol işlenen boş olduğundan, "y" ile ayarlanır. Eğer '(Object) null' eklerseniz, autounboxing'in 'boole' olmasını engellersiniz ve eğer 'Boolean y' eklerseniz, 'null' 'Boolean' türüne sığdığı için unboxing gerekli değildir. – njzk2

+2

test edildikten sonra, NPE görünüşte '(x? X: ...) 'da olur, çünkü derleyici' (y? Y: null) 'nin sonucunun' boolean 'olması gerektiğini düşünür. – njzk2

+1

@ njzk2 Bu, ilgili http olabilir : //stackoverflow.com/questions/3882095/booleans-conditional-operators-and-autoboxing 'i (y? y: null) '' returnNull() 'eşdeğeri olarak ele alırsak (ama henüz okumadım) bu yüzden yanılıyor olabilirim. – Pshemo

1

(bu kod okunamıyor ve muhtemelen önlenmelidir.) Ancak aslında yanıtlamak için: Yukarıdaki gibi, gerekçelendirme autoboxing ve unboxing ve derleyici çekler yapmak zorunda. Çalışma zamanında bir NPE atacak olan boolean b = (Boolean) null'u yazmışsınız gibi.

Örnek A'da, bunu açıkça bir Object'e döküyorsunuz, bu nedenle otomatik kutu eklemesi yok.

B örneğinde, her şey zaten bir nesnedir (Boole bir ilkeldir, Boolean bir nesnedir), yine, hiçbir boks veya kutucuk yoktur. Son olarak, örneğin, C, hiç bir kutulama yoktur ve bunun yerine, sonuç döndüğünde yalnızca kutulanır. (if-else branching, derleyicinin, her bir dalı tek tek kontrol etmesine izin verir, üçlü operatörler yerine, ifadenin bütününü belirleme ve ardından tüm ifadeyi bir tür olarak atama. Bu, ifadeler ve ifadeler ile bir sürü gariplik ile ilgilidir. Java autoboxing ve tür denetim kuralları)

(sizin gibi uyumsuz bir döküm çalışırsanız Döküm sorunlar derleme zamanında gerçekleşir:. Eğer böyle bir şey yaparsanız (Boolean) 7 veya çalışma zamanında: O atıyor

int c = 7; 
Object co = (Object) c; 
Boolean bco = (Boolean) co; 
İlgili konular