每天早上七点三十,准时推送干货
今天是六一儿童节,各位大朋友们每天也要开开心心哦~
最近,阿粉在一个业务改造中,使用三目运算符重构了业务代码,没想到测试的时候竟然发生 NPE 的问题。
重构代码非常简单,代码如下:
// 方法返回参数类型为 Integer
// private Integer code;
SimpleObj simpleObj = new SimpleObj();
// 其他业务逻辑
if (simpleObj == null) {
return -1;
} else {
return simpleObj.getCode();
}
这段 if 判断,阿粉看到的时候,感觉很是繁琐,于是使用三目运算符重构了一把,代码如下:
// 方法返回参数类型为 Integer
SimpleObj simpleObj = new SimpleObj();
// 其他业务逻辑
return simpleObj == null ? -1 : simpleObj.getCode();
测试的时候,第四行代码抛出了空指针,这里代码很简单,显然只有 simpleObj#getCode
才有可能发生 NPE 问题。
但是我明明为 simpleObj
做过判空判断,simpleObj
对象肯定不是 null,那么只有 simpleObj#getCode
返回为 null。但是我的代码并没有对这个方法返回值做任何操作,为何会触发 NPE?
难道是又是自动拆箱导致的 NPE 问题?
在解答这个问题之前,我们首先复习一下三目运算符。
三目运算符
三目运算符,官方英文名称:Conditional Operator ? :,中文直译条件表达式,本文不纠结名称,统一使用三目运算符。
三目运算符的基本用法非常简单,它由三个操作数的运算符构成,形式为:
<表达式 1>?<表达式 2>:<表达式 3>
三目运算符的计算从左往右计算,首先需要计算计算表达式 1 ,其结果类型必须为 Boolean
或 boolean
,否则发生编译错误。
当表达式 1 的结果为 true
,将会执行表达式 2,否则将会执行表达式 3。
表达式 2 与表达式 3 最后的类型必须得有返回结果,即不能为是 void
,若为 void
,编译时将会报错。
最后需要注意的是,表达式 2 与表达式 3 不会被同时执行,两者只有一个会被执行。