开发中发生的奇怪的问题,类似如下的代码NPE了。。。
boolean flag = false;
Integer a = null;
Integer n = flag ? 1 : a;
原来是在计算三元表达式结果时,a变量自动拆箱了。经 javap 反汇编发现,确实调用了Integer.intValue()
方法。
在三元表达式计算中,当第二、第三位操作数中有基本类型和对象时,对象就会拆箱为基本类型进行操作。所以如果使用了基本类型或者隐式的使用了基本类型,需要考虑NPE问题。
-
表达式中未使用基本类型,正常运行,n为null
Integer a = null; Integer b = 1; Integer n = false ? b : a;
-
表达式中隐式使用了基本类型,NPE
Integer a = null; Integer b = 1; Integer c = 2; // b+c操作是将b和c变量自动拆箱后计算的 Integer n = false ? b + c : a;
-
表达式结果为基本类型,NPE。这个错误比较明显,虽然错误不是在三元表达式计算过程中出现的,但也应注意这种情况导致的NPE。
Integer a = null; Integer b = 1; int n = false ? b : a;
如果业务逻辑中不能确保不出现null,还是用if...else...
代替三元表达式吧。
下面的代码会NPE吗?
boolean flag = false;
int a = 1; // or Integer a = 1;
Integer n = flag ? a : null;
测试发现不会NPE,n的结果为null。这种情况不符合”第二、第三位操作数中有基本类型和对象"这个条件,不会触发自动拆箱。
完结撒花✿✿ヽ(°▽°)ノ✿