温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-12-29 17:21:11 来源:亿速云 阅读:299 作者:小新 栏目:大数据

小编给大家分享一下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通过三元表达式进行赋值。运行一下这个代码就会出现空指针异常:

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

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

 

二、问题分析

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

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命令,反编译一下:

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

答案现在应该清楚了,

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

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

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

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

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

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

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

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

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

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

 

三、问题解决

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI