This question already has an answer here:
Can someone explain me why in the first case null pointer was detected, but no on the other ?
Maybe he always looks on the first type, but why he does so only if the condition is false..
@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
}
When you use ternary operator,
Type1 and type2 must be of same type while conversion. First it realises type1 and then type2.
Now look at your cases
Since
type1
is0
and it takes as a primitive and sincea
is trying to convert it as aprimitive
. Hence the null pointer.where as same tricky test5
Since a is of type
Integer
0 boxed to wrapper integer and assigned to the LHS.I think in this case
a
will unboxed to an int, because 0 is an int . That means thatnull.intValue()
is called and get an NPE