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

Kim*_*_do 5 java ternary-operator nullpointerexception

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

也许他总是看第一种,但是为什么他只在条件为假的情况下才看。

@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
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*tta 5

当您使用三元运算符时,

 flag  ? type1 : type2
Run Code Online (Sandbox Code Playgroud)

转换时,类型1和类型2必须具有相同的类型。首先,它实现了type1,然后实现了type2。

现在看看你的情况

 final Integer b = false ? 0 : a;
Run Code Online (Sandbox Code Playgroud)

因为type1is 0并且它将作为原始,并且因为a正试图将其转换为primitive。因此为空指针。

在哪里一样棘手的测试5

 final Integer b = false ? a : 0;
Run Code Online (Sandbox Code Playgroud)

由于a的类型为Integer0,因此将其包装到包装整数并分配给LHS。