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; 

因为type10并且它作为基元并且因为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;