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

时间:2016-06-29 09:30:25

标签: java nullpointerexception ternary-operator

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

也许他总是看第一种类型,但为什么只有在条件错误时才这样做。

@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 个答案:

答案 0 :(得分:4)

使用三元运算符时,

 flag  ? type1 : type2

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

现在看看你的案例

 final Integer b = false ? 0 : a;

由于type10,因此a正在尝试将其转换为primitive。因此空指针。

同样棘手的测试5

 final Integer b = false ? a : 0;

由于类型Integer 0的类型为封装整数并分配给LHS。

答案 1 :(得分:3)

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

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

    final Integer b = false ? 0 : a;