最近碰到个非常有意思的坑,先来看段代码:
Test test = new Test();
Integer age = Objects.nonNull(test) ? test.getAge() : 18;
System.out.println("age = " + age);
猜猜运行后会输出什么?是 null
吗?不对,是 java.lang.NullPointerException
来解释解释是为什么。
这是因为编译器自动执行拆箱操作所导致的。
由于三元运算后面的数字 18
是基本类型,因此编译器默认会把 test.getAge()
向下转型后再进行两者比较。
综上,上面的这段代码就相当于如下:
Test test = new Test();
// 当 age 为 null 时就出现可恶的 NPE
Integer age = Objects.nonNull(test) ? test.getAge().intValue() : 18;
System.out.println("age = " + age);
怎么解决?或者说如何避免呢?以后使用三元运算符,就得多个心眼了,可以像下面这样写:
Test test = new Test();
// 前后都是包装类型,避免编译器拆箱后再比较
Integer age = Objects.nonNull(test) ? test.getAge() : Integer.valueOf(18);
System.out.println("age = " + age);
或者干脆就不用三元运算:
Test test = new Test();
Integer age ;
if (Objects.nonNull(test)) {
age = test.getAge();
}else {
age = 18;
}
System.out.println("age = " + age);