2016-06-29 25 views
4

Kann mir jemand erklären, warum im ersten Fall Nullzeiger erkannt wurde, aber nicht auf der anderen?java ternäre Bedingungen merkwürdig null Zeiger Ausnahme

Vielleicht sieht er immer auf dem ersten Typ, aber warum tut er dies nur, wenn die Bedingung falsch ist ..

@Test 
public void test1() { 
    final Integer a = null; 

    final Integer b = false ? 0 : a; 

    //===> NULL POINTER EXCEPTION 
} 

@Test 
public void test2() { 
    final Integer b = false ? 0 : null; 

    //===>NOT NULL POINTER EXCEPTION 
} 

@Test 
public void test3() { 
    final Integer a = null; 

    final Integer b = true ? 0 : a; 

    //===>NOT NULL POINTER EXCEPTION 
} 

@Test 
public void test4() { 
    final Integer a = null; 

    final Integer b = false ? new Integer(0) : a; 

    //===> NOT NULL POINTER EXCEPTION 
} 

@Test 
public void test5() { 
    final Integer a = null; 

    final Integer b = false ? a : 0; 

    //===>NOT NULL POINTER EXCEPTION 
} 
+0

Mögliche dupe: http://stackoverflow.com/questions/12763983/nullpointerexception-through-auto-boxing-behavior-of-java-ternary-operator (Ich stimme nicht, um die Frage nicht zu schließen) –

+0

"Wenn einer der zweiten und dritten Operanden ist vom Grundtyp T, und der Typ des anderen ist das Ergebnis der Anwendung der Boxumwandlung (§5.1.7) auf T, dann ist der Typ des Bedingungsausdrucks T. Warum also Test3 und Test5 nicht NPE? Entschuldigung, ich habe es nicht bekommen –

Antwort

4

Wenn Sie ternären Operator verwenden,

flag ? type1 : type2 

Typ1 und Typ2 gleichen Typs während Konvertierung sein muss. Zuerst erkennt es type1 und dann type2.

Sehen Sie sich jetzt Ihre Fälle

final Integer b = false ? 0 : a; 

Seit type10 ist und es dauert als primitiv und da a versucht, es als primitive zu konvertieren. Daher der Nullzeiger.

wo gleichen wie heikel test5

final Integer b = false ? a : 0; 

Da ein vom Typ Integer 0 den LHS integer und zugewiesen wrapper eingerahmt.

+1

Diese Antwort erklärt auf einer anderen Ebene, was die vorherige Antwort sagt (der Grund dafür, dass "null.intValue()" aufgerufen wird. Gute Antwort ;-) –

+0

Thx für deine Antwort, kannst du erklären, warum test3 NPE nicht geworfen hat? Warum wurde die Konvertierung nicht auf 'type1' angewendet, also wurde a in ein primitives umgewandelt? –

+1

'final Integer b = true? 0: a;' Da das Flag wahr ist, ging es auf 0 und das Boxen geschieht mit dem neuen Integer (0). Null ist eine gültige Ganzzahl richtig? –

3

ich in diesem Fall denke a in einem int unboxed wird, weil 0 ein int . Das bedeutet, dass null.intValue() genannt wird und eine NPE bekommen

@Test 
public void test1() { 
    final Integer a = null; 

    final Integer b = false ? 0 : a; 
+0

Nun, ich bin mir nicht sicher, dass das der Grund ist. Wie kommt es, dass test4 dann keine NPE wirft? –

+0

Das Problem ist, dass Java "a" interpretiert als ein int wegen "?" –

+1

Es wird tatsächlich * un * boxed zu einem 'int'. Aber ich frage mich, warum Test2 scheint es zu boxen, während Test1 scheint es zu entpacken ... aber @DylanMeeus, das ist, weil nichts auf dem 'null' in Test 4 aufgerufen wird, da kein (un) Boxen dort getan wird. – Siguza