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;
因为 type1
是 0
并且它作为一个原始类型并且因为 a
试图将它转换为 primitive
。因此空指针。
其中同样棘手的测试5
final Integer b = false ? a : 0;
因为 a 的类型是 Integer
0 装箱到包装器整数并分配给 LHS。
谁能解释一下为什么在第一种情况下检测到空指针,而在另一种情况下却没有?
也许他总是看第一种,但为什么他只在条件为假时才看..
@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;
因为 type1
是 0
并且它作为一个原始类型并且因为 a
试图将它转换为 primitive
。因此空指针。
其中同样棘手的测试5
final Integer b = false ? a : 0;
因为 a 的类型是 Integer
0 装箱到包装器整数并分配给 LHS。