网站首页 > 精选教程 正文
后端业务逻辑中,属性逻辑判定时,经常会用到三元表达式: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
- 上一篇: Java运算符复合赋值运算符三元运算符圆括号改变运算优先级
- 下一篇: Java三元表达式中的陷阱
猜你喜欢
- 2024-11-17 项目中的参数限制、非空、以及集合中的验证,你真的会做吗
- 2024-11-17 方法和+=符号的运算
- 2024-11-17 Java运算符之比较运算符
- 2024-11-17 《Java开发手册灵魂13问》正式上线,带你剖析阿里巴巴的开发细节
- 2024-11-17 03_Java_基础_表达式
- 2024-11-17 如何在 Python 中使用三元运算符?
- 2024-11-17 三目运算符的空指针问题,终于被阿里巴巴开发手册收录了
- 2024-11-17 Elasticsearch:painless script语法编程和入门实战
- 2024-11-17 golang三元表达式
- 2024-11-17 Java数组案例
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)