java三元条件奇怪的空指针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 }
当你使用三元运算符时,
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。
我认为在这种情况下, a
将取消装箱到一个int,因为0是一个int。 这意味着调用null.intValue()
并获得NPE
@Test public void test1() { final Integer a = null; final Integer b = false ? 0 : a;