大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
Java 三目运算符细节详解
@author:Jingdai
@date:2020.09.24
看到标题你肯定觉得三目运算符有什么好讲的,不是很简单嘛。我之前也是这么认为的,直到今天刷LeetCode遇到了一点问题,发现还是有些细节自己不知道的,现总结一下。
短路问题
首先我们都知道Java中
&&
和||
的运算是具有短路效果的,如果逻辑运算符的第一部分能确定运算的结果,就不会再去计算逻辑运算符的第二部分,比如下面的代码,输出的i
仍然是1,因为后面的运算短路了,没有计算。int i = 1; if (true || (i++) > 5) { System.out.println("test"); } System.out.println(i); // 1
回到三目运算符,三目运算符也会有短路效果吗?看下面的代码。
int i = 5; int j = true ? 1 : ++i; System.out.println(i); // 5
结果输出是 5 ,说明三目运算符也有类似逻辑运算符的短路问题,直接去
true
和false
对应的地方取结果,不会计算另一部分,即使把代码写成下面这样结果一样,输出结果还是 5 ,不会因为顺序而改变。int i = 5; int j = false ? ++i : 1; System.out.println(i); // 5
运算顺序问题
先看下面的代码。
int[] array = new int[5]; int i = 4; boolean flag = i++ > 4 ? true : false; System.out.println(flag); // false i = 4; int b = i++ > 3 ? array[i] : array[i];
我们知道
i++
是先赋值再进行自加,所以flag
的结果是false
很好理解,但是下面b
的结果会是多少呢?直接看运行结果。false Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at A.main(A.java:16)
结果是抛出数组越界异常,结果说明在比较结束的时候,
i
的值已经加了,即此时i = 5
,再去取数组的值的时候就会抛出数组越界异常,所以千万不要认为i
值在整个表达式结束后才会增加。
包装类问题
在使用三目运算符处理包装类时,要注意 NPE 问题,看下面的代码。
int a = 5; Integer b = null; int c = true ? a : b; System.out.println(c); // 5
在这个例子中,会输出 5 ,没有什么问题,但是把代码稍微变一点,看下面的代码。
int a = 5; Integer b = null; int c = true ? b : a; System.out.println(c);
仅仅是将
a
和b
交换了一下位置,运行就会报NullPointerException
,这是为什么的。这也很好理解,当为true
时,会选b
,因为前面c
是基本数据类型,所以这时包装类会自动拆箱,变成下面这样的代码,而b
是null
,所以会抛出NullPointerException
异常。int a = 5; Integer b = null; int c = true ? b.intValue() : a; System.out.println(c);
但是,将代码变成下面这样,按理说应该不会有什么问题,因为
c
是包装类型,可以接收null
,但是运行时还是会发生NullPointerException
异常。其实,当三目运算符的第二、第三个操作数分别为基本类型的包装类和基本数据类型时,并且选择了包装类那一项,则包装类会自动进行拆箱操作。即代码还是会进行拆箱操作,所以会发生NullPointerException
异常,这点非常容易使人弄错。int a = 5; Integer b = null; Integer c = true ? b : a; // 还是会变成Integer c = true ? b.intValue() : a; System.out.println(c);
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226781.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...