JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java:三元表达式判空了还会抛NPE

wys521 2024-11-17 16:54:55 精选教程 24 ℃ 0 评论

后端业务逻辑中,属性逻辑判定时,经常会用到三元表达式:A ? B : C

code review时,A/B/C还有相关布尔判定也会注意。但是有时候,看上去该判空的地方都判空,Runtime时还会出现NullPointException?

生产业务对象更复杂,代码简单改写下,大概如下:

boolean finalBool = preCheck ||
        ("V".equals(surName) 
                && "Someone".equals(name) 
                && someone.getName() == null ? false : someone.getName().equals("other expression");

乍看一眼,该判空的地方都判空了,不可能会走到三元表达式C部分逻辑,即someone.getName()导致NPE。

真相时,逻辑与或跟三元表达式一起时,编译器会改变逻辑表达式!

boolean finalBool = preCheck || 
(!"V".equals(surName) || !"Someone".equals(name) || someone.getName() != null) 
&& someone.getName().equals("other expression");     

最终class反编译出来所见,与或布尔逻辑顺序调整,当surName或name表达式为true时,不执行判空逻辑someone.getName(),导致最终执行抛错。

someone.getName().equals("other expression")

增删改布尔逻辑判断很容易顺着写下去,看上去改判空的地方都做了处理,也还是会有意外。

建议是:

1、与或 + 三元表达式一起使用时,逻辑表达式最好用括号区分优先级;

2、对象equal比值,虽然看似判空了,还是用更安全的比值方法,比如Objects.equals

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表