java ternary conditions strange null pointer excep

2019-02-18 06:43发布

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
}

2条回答
趁早两清
2楼-- · 2019-02-18 07:38

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.

查看更多
一夜七次
3楼-- · 2019-02-18 07:39

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;
查看更多
登录 后发表回答