千家信息网

java中使用三元表达式会遇到什么问题

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,小编给大家分享一下java中使用三元表达式会遇到什么问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、问题重现public class Test { public stat
千家信息网最后更新 2025年12月01日java中使用三元表达式会遇到什么问题

小编给大家分享一下java中使用三元表达式会遇到什么问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!


一、问题重现

public class Test {
public static void main(String[] args) {
Integer a = null;
boolean flag = false;
Integer b = flag ? 1*2 : a;
System.out.println("程序结束");
}
}

代码很简单,a是包装类型Integer,初始值是null,b通过三元表达式进行赋值。运行一下这个代码就会出现空指针异常:

为什么会出现这个现象呢?下面我们来分析一下:

二、问题分析

刚刚这个空指针现象很容易我们就想到类型转化上,三元表达式的类型转换同样要遵守一定的规则才可以。

1、三元操作符类型的转换规则:

(1)若两个操作数不可转换,则不做转换,返回值为Object类型

比如Object b = flag ? A : B,此时A和B是两个不同的对象,不可转换,那就把最终结果赋值给Object

(2)若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。

这个就比较容易理解了,比如float b = flag ? 1:1.0f。1为int类型向上转即可。

(3)若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。

这种情况就是刚刚我们所演示的例子,Integer b = flag ? 1 *2: a,结果是b=a,但是a是null,要强制转换成Integer(1 * 2的类型),于是就出现了空指针。

(4)若两个操作数都是直接量数字,则返回值类型为范围较大者。

这种情况和第二种类似。

现在答案基本上出来了,出现空指针的原因是,a=null,要强制转换Integer,于是出现了空指针,因为虚拟机看到一个null就找不到要转化的对象了。

2、反编译分析

现在我们找到Test的字节码文件,输入javap -c命令,反编译一下:

答案现在应该清楚了,

3、为什么要拆箱(重点)

为什么要对a进行拆箱,直接把a=null赋值给b不就完事了嘛。这一点就需要我们注意一下那个前提条件,也就是说一个是数字,一个是表达式,刚刚的那个例子也验证了这个观点,现在我不是表达式,再来验证一下:

现在我们可以看到不是表达式,依然会出现这个错误。别着急,还有让你更晕的,我们再来改变一下代码:

这尼玛恶心,我测试了很多不同的案例,基本上就分为这两种情况。原因如下:

条件表达式?表达式 1 :表达式 2,假设结果是表达式2

(1)表达式1和2都为null,表达式2看到1是null,则不会进行拆箱。

(2)表达式1为数字或者是表达式,表达式2根据1的类型进行拆箱。

也就是说表达式2主要依据表达式1判断是否进行拆箱操作。

三、问题解决

解决方案很简单,那就是只要遇见null在三元表达式里,就尽量转化为if结构。

看完了这篇文章,相信你对"java中使用三元表达式会遇到什么问题"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

表达式 类型 三元 数字 问题 指针 两个 操作数 代码 情况 结果 范围 分析 不同 也就是 也就是说 例子 原因 对象 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发的生命周期5个阶段 教育局网络安全专业 网络安全防护在企业是什么岗位 数据库中什么时候需要where 情侣头像怎么制作软件开发 交通运输有哪些数据库系统 小型软件开发价格实惠 浙大计算机网络安全 纪实软件开发 轻量应用服务器数据库空间多少 云上的数据库实例技术 云食尚分拣软件开发 5g为什么会影响网络安全 局域网网络硬盘服务器 数据库修改视图后怎么保存 魔域私服服务器连接失败 深度智能网络技术自动答题入口 使用计算机网络技术创新服务 戴尔服务器配置远程管理卡 数据库工程师考试真题与答案 选修 网络技术应用 大学网络安全教育班会总结 战地5如何进服务器 机械想转行做软件开发 如何自己配置dns服务器 云上的数据库实例技术 陕西省网络安全协会029 软件开发流程感想 网络安全服务器厂商 青岛网络安全征集
0