坏味003:代码质量差一半因为空指针
#Smell #Java #Basic #Quantity
1.日志:常见的NPE日志
(a) 图①:是最常见的包含了栈信息的空指针(NPE)日志。
(b) 没有栈信息的NPE日志,其特点是在服务器上,没有栈信息,
只记录NullPointerException: null
,是JVM优化的结果。
记得和这个参数有关 -XX:-OmitStackTraceInFastThrow
(c) 字符串伪装者,是某个傻叉toString后得到"null"
,再引发异常。
于是,这个字符串null,成功的掩护了root cause
。
2.坏味:避免常见的NPE
使用好IDE和代码分析工具,编码时或提交前,根据提示能消除NPE。
图②:点(.)前点后空指针,一个普通的代码。
再按下orderDao
后面的点
时,我们必须要明确,
orderDao是否是null,返回值order是否为null。
图③:if求值(Boolean-boolean)时,可能NPE
图④:显示赋值,Long 到 long,可能NPE
图⑤:使用@Contract和@NotNull提高代码质量(IDE支持)
3.总结:避免NPE的实践
敲代码时,常见的NPE场景和有效预防的操作点。
(a) 点(.)前后,每次按下.
其前和后是否为null
(b) 等(=)求值,每次自动拆包(Boolean→boolean)
(c) 使用Empty代替null,表示集合或数组为空
(d) 使用业务默认值,表示null,并使所有字段not null
(e) 使用javax.annotation.Nonnull
(google)
(f) 使用org.jetbrains.annotations.NotNull
(推荐)
(g) 使用org.jetbrains.annotations.Contract
(推荐)
(h) 使用Option,尤其在使用stream调用链时
其中,
(a-c)是基本功,攻城狮必修课。
(d)是业务能力和数据能力,要在数据建模阶段入手。
(e-g)是最佳实际,都是全行业交学费积累的。
(h)在java8后尤其推荐。
–
※ 我们的征途是星辰大海 ※