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,
flag ? type1 : type2
Type1 and type2 must be of same type while conversion. First it realises type1 and then type2.
Now look at your cases
final Integer b = false ? 0 : a;
Since type1
is 0
and it takes as a primitive and since a
is trying to convert it as a primitive
. Hence the null pointer.
where as same tricky test5
final Integer b = false ? a : 0;
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 that null.intValue()
is called and get an NPE
@Test
public void test1() {
final Integer a = null;
final Integer b = false ? 0 : a;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With