有人可以解释一下为什么在第一种情况下检测到空指针,但在另一种情况下却没有?
也许他总是看第一种类型,但为什么只有在条件错误时才这样做。
@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
}
答案 0 :(得分:4)
使用三元运算符时,
flag ? type1 : type2
转换时,Type1和type2必须是相同类型。首先它实现type1然后实现type2。
现在看看你的案例
final Integer b = false ? 0 : a;
由于type1
为0
,因此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;