java 三元条件奇怪的空指针异常

java ternary conditions strange null pointer exception

谁能解释一下为什么在第一种情况下检测到空指针,而在另一种情况下却没有?

也许他总是看第一种,但为什么他只在条件为假时才看..

@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
}

我认为在这种情况下 a 将拆箱为一个整数,因为 0 是一个整数。这意味着 null.intValue() 被调用并获得 NPE

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

    final Integer b = false ? 0 : a;

当你使用三元运算符时,

 flag  ? type1 : type2

转换时Type1和type2必须是同一类型。首先它实现了 type1,然后是 type2。

现在看看你的案例

 final Integer b = false ? 0 : a;

因为 type10 并且它作为一个原始类型并且因为 a 试图将它转换为 primitive。因此空指针。

其中同样棘手的测试5

 final Integer b = false ? a : 0;

因为 a 的类型是 Integer 0 装箱到包装器整数并分配给 LHS。