星辰大海▼ 2020▼ Smell Java Basic Quantity

坏味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后尤其推荐。

※ 我们的征途是星辰大海 ※

《坏味003:代码质量差一半因为空指针》  1.日志:常见的NPE日志 (a) 图①:是最常见的包含了栈信息的空指针(NPE)日志。   (b) 没有栈信息的NPE日志,其特点是在服
题图:Astronomy Picture of the Day, Discover the cosmos!