前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >习惯用三元运算符?那你需要知道这个坑

习惯用三元运算符?那你需要知道这个坑

作者头像
happyJared
修改于 2021-05-18 02:02:17
修改于 2021-05-18 02:02:17
4980
举报
文章被收录于专栏:happyJaredhappyJared

最近碰到个非常有意思的坑,先来看段代码:

代码语言:txt
AI代码解释
复制
        Test test = new Test();
        Integer age = Objects.nonNull(test) ? test.getAge() : 18;
        System.out.println("age = " + age);

猜猜运行后会输出什么?是 null 吗?不对,是 java.lang.NullPointerException

来解释解释是为什么。

这是因为编译器自动执行拆箱操作所导致的。

由于三元运算后面的数字 18 是基本类型,因此编译器默认会把 test.getAge() 向下转型后再进行两者比较。

综上,上面的这段代码就相当于如下:

代码语言:txt
AI代码解释
复制
        Test test = new Test();
        // 当 age 为 null 时就出现可恶的 NPE 
        Integer age = Objects.nonNull(test) ? test.getAge().intValue() : 18;
        System.out.println("age = " + age);

怎么解决?或者说如何避免呢?以后使用三元运算符,就得多个心眼了,可以像下面这样写:

代码语言:txt
AI代码解释
复制
        Test test = new Test();
        // 前后都是包装类型,避免编译器拆箱后再比较
        Integer age = Objects.nonNull(test) ? test.getAge() : Integer.valueOf(18);
        System.out.println("age = " + age);

或者干脆就不用三元运算:

代码语言:txt
AI代码解释
复制
        Test test = new Test();
        Integer age ;
        if (Objects.nonNull(test)) {
            age = test.getAge();
        }else {
            age = 18;
        }
        System.out.println("age = " + age);

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
int 和 integer :装箱和拆箱的过程,会用到什么方法,你觉得这个会对性能有影响吗,原因是什么(百度一面)
今天继续来讲面试,已经出了很多java一面真题系列文章了,之后也会整理成一个系列,欢迎持续关注哦。
用户7656790
2020/09/01
2.7K0
重大线上事故!三元表达式引发的空指针问题
属实刺激,刚入职不久就遇到这种史诗级的线上 Bug,首页直接崩溃,陈年老代码爆雷,不管落到最后的底层原因是什么,我感觉主要还是上下游的链路太过复杂,治理难度比较大,牵一发而动全身。 知识回顾 三目运算
飞天小牛肉
2023/09/09
2440
重大线上事故!三元表达式引发的空指针问题
Java之三元运算符
文章目录 三元运算符 1. 基本语法 2. 案例演示 TernaryOperator.java 3. 三元运算符使用细节 4. 课堂练习 三元运算符 1. 基本语法 条件表达式 ? 表达式 1: 表达
兮动人
2021/06/11
1.2K0
Java之三元运算符
【小家java】大杂烩---那些年我们一起躺过的坑
此篇博文没有具体的主题,主要针对于平时开发过程中遇到的一些小问题的记录,并且大都从源码的角度去解释为什么会报错。并且此篇博文是持续更新中。。。
YourBatman
2019/09/03
3790
【小家java】大杂烩---那些年我们一起躺过的坑
Java避坑指南之:三元操作符(?: )
由于java14版本对NPE异常增加了新特性,可以详情展示NPE发生的具体信息,我们可以很容易看到哪个变量发生了NPE异常。但是早期的版本是不具有这样的功能。
崔认知
2023/06/19
1990
Java避坑指南之:三元操作符(?: )
三元运算符引发的自动拆装箱问题 - Java技术债务
乍一看,真没有什么问题(当然可能是我经验不足),细看会发现自动装箱导致空指针异常,上边set方法代码可以拆分为两行:
Java技术债务
2024/06/21
1030
三元运算符引发的自动拆装箱问题 - Java技术债务
Java 三目运算符细节详解
看到标题你肯定觉得三目运算符有什么好讲的,不是很简单嘛。我之前也是这么认为的,直到今天刷LeetCode遇到了一点问题,发现还是有些细节自己不知道的,现总结一下。
用户7886150
2021/02/01
1K0
Java运算符-三元运算符,这你必须得会!
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/04/30
1940
Java运算符-三元运算符,这你必须得会!
我去,这么简单的条件表达式竟然也有这么多坑
最近,小黑哥在一个业务改造中,使用三目运算符重构了业务代码,没想到测试的时候竟然发生 NPE 的问题。
andyxh
2020/06/05
4470
Java的条件操作符if-else很简洁很实用,但有坑!
在Java编程中,三元操作符if-else是一种非常实用的条件操作符,它允许开发者在一行代码中完成条件判断和结果选择。然而,如果使用不当,它也可能引发空指针异常(NullPointerException,简称NPE)。本文将探讨Java三元操作符的使用及其与NPE的关系,并提供一些避免错误的建议。
烟雨平生
2024/11/23
1350
Java的条件操作符if-else很简洁很实用,但有坑!
Java 三元运算符 实现 四舍五入
(四舍五入:小数点后面的第一位小于等于4,直接舍弃,大于4向前进一位再舍弃。比如:3.4四舍五入后 为3;3.5四舍五入后为4) 当涉及在Java中实现四舍五入操作时,三元运算符是一种有效且简洁的方法。本文将介绍如何使用Java的三元运算符来实现四舍五入,以下是相关内容的整理:
猫头虎
2024/04/07
2380
算数、赋值、比较、逻辑、三元运算符
算数运算符 算数运算符包括: + 加法运算,字符串连接运算 - 减法运算 * 乘法运算 / 除法运算 % 取模运算,两个数字相除取余数 ++ 、 – 自增自减运算 Java中,整数使用以上运算符,无论怎么计算,也不会得到小数。 public static void main(String[] args) { int i = 1024; System.out.println(i/1000*1000);//计算结果是1000 } ++ 运算,变量自己增长1。反之, – 运算,变量自己减少1
共饮一杯无
2022/11/28
3920
三元运算符用法_三元运算符判断三个值
大家好,又见面了,我是你们的朋友全栈君。 一、三元运算符 条件运算符 (?:) 也称为三元条件运算符,用于计算布尔表达式,并根据布尔表达式的计算结果为 true 还是 false 来返回(使
全栈程序员站长
2022/09/27
7540
java之Optional的使用和源码分析
ok,今天自己分享下使用jdk提供的Optional工具类如何使用进行对null的判空操作。还是一贯的风格,先看下示例程序。
码农王同学
2019/10/30
4820
三元运算符
三元运算符在Python中通常被称为条件表达式。 这些运算符根据条件是否正确来评估某些事情。
Helloted
2022/06/06
8550
【蓝桥杯Java_C组·从零开始卷】第一节、环境与变量类型&运算符与类型分析
B站高清回放地址: 【https://www.bilibili.com/video/BV1Bm4y1Q7Wt?spm_id_from=333.999.0.0】 目录 一、Java环境搭建与使用(Ecl
红目香薰
2022/11/29
2990
【蓝桥杯Java_C组·从零开始卷】第一节、环境与变量类型&运算符与类型分析
从一个 NullPointerException 探究 Java 的自动装箱拆箱机制
前天遇到了一个 NullPointerException,触发的代码类似下面这样:
零式的天空
2022/03/28
4680
99%的Java程序员会踩的6个坑
不知道你在项目中有没有见过,有些同事对Integer类型的两个参数使用==号比较是否相等?
苏三说技术
2022/09/22
5040
99%的Java程序员会踩的6个坑
JAVA三元运算符_java中三元运算符详解
三元运算符是if else或者if else if else的简写形式,可以使代码看起来简洁些。
全栈程序员站长
2022/09/27
6190
《Java 开发手册》解读:三目运算符为何会导致 NPE?
阿里妹导读:在三目运算符中,表达式 1 和 2 在涉及算术计算或数据类型转换时,会触发自动拆箱。当其中的操作数为 null 值时,会导致 NPE 。本文将详细剖析 NPE 出现的原因,重新梳理相关知识点,并进一步扩展,帮助大家彻底理解这个问题。
墨鬓
2020/07/30
1.7K0
《Java 开发手册》解读:三目运算符为何会导致 NPE?
相关推荐
int 和 integer :装箱和拆箱的过程,会用到什么方法,你觉得这个会对性能有影响吗,原因是什么(百度一面)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档