专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java三目运算你真的了解透了么?(java中三目运算符怎么用)

temp10 2024-09-27 02:48:39 java教程 10 ℃ 0 评论

最近在项目中使用三目运算时候,出现了一个意想不到的问题,特与大家分享一下。



Java三目运算你真的了解透了么?(java中三目运算符怎么用)

经常在写代码中会遇到一些if-else判断,比如以下代码:

这样写显然不够优雅,代码看起来很是臃肿,要是判断很多,代码就会非常混乱,三目运算虽然不能百分百代替if-else ,适当的使用会使你的代码变得很简洁,比如以上代码这样写:

这中方式用了很多次,从没出现过错误,但是最近项目中使用时候报了空指针,

boolean flag=false;

Integer numA=flag?1:b;

按照自己判断 numA应该为null ,但是结果却是抛了个异常,Exception in thread "main" java.lang.NullPointerException。既然抛了异常,那么就是调用了null对象的方法或者属性,而经过检查判断,flag已经有值,只有可能是b。但是常理判断b为null不应该正常赋值么,为何报个空指针。那么既然表象看不出原因 我们来反编译以下这块代码。

都是jvm指令 关键就是第13条指令,把上述命令精简以下就是

Integer numA1 = Integer.valueOf(flag? 1 : b.intValue());

要是理解java一些基本类型的拆箱和装箱,你应该就懂了,这里在取b的时候进行了一次拆箱,变成基本类型了。为何这里进行拆箱操作呢。我们来换一种写法:

这种写法居然没报错,也就是其是否拆箱为基本类型,和待选结果类型有关呢?

翻了下JDK说明文档对三目运算进行了以下描述.。当第二和第三目为基本类型和对象情况时,其中的对象在被命中后会进行拆箱操作。

总结以下就是上述运算中1为基本类型,b为int对象,第二、第三位操作数分别是基本类型和对象。所以对对象进行拆箱操作,由于该对象为null,所以在拆箱过程中调用null.initValue()的时候就报了空指针。

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

欢迎 发表评论:

最近发表
标签列表