Java 三目运算符细节详解「建议收藏」

Java 三目运算符细节详解「建议收藏」Java三目运算符细节详解@author:Jingdai@date:2020.09.24看到标题你肯定觉得三目运算符有什么好讲的,不是很简单嘛。我之前也是这么认为的,直到今天刷LeetCode遇到了一点问题,发现还是有些细节自己不知道的,现总结一下。短路问题首先我们都知道Java中&&和||的运算是具有短路效果的,如果逻辑运算符的第一部分能确定运算的结果,就不会再去计算逻辑运算符的第二部分,比如下面的代码,输出的i仍然是1,因为后面的运算短路了,没有计算。in

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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

Jetbrains全家桶1年46,售后保障稳定

回到三目运算符,三目运算符也会有短路效果吗?看下面的代码。

int i = 5;
int j = true ? 1 : ++i;
System.out.println(i);  // 5

结果输出是 5 ,说明三目运算符也有类似逻辑运算符的短路问题,直接去 truefalse 对应的地方取结果,不会计算另一部分,即使把代码写成下面这样结果一样,输出结果还是 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);

仅仅是将 ab 交换了一下位置,运行就会报 NullPointerException ,这是为什么的。这也很好理解,当为 true 时,会选 b ,因为前面 c 是基本数据类型,所以这时包装类会自动拆箱,变成下面这样的代码,而 bnull ,所以会抛出 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);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226781.html原文链接:https://javaforall.net

(0)
上一篇 2025年6月24日 下午6:15
下一篇 2025年6月24日 下午6:43


相关推荐

  • 生成函数知识总结

    生成函数知识总结生成函数基础知识 OJ 练习 FruitHDU 2152 普通生成函数 排列组合 HDU 1521 指数生成函数 Ignatiusandt 1028 普通生成函数 HoldingBin LadenCaptive HDU 1085 普通生成函数 悼念 512 汶川大地震遇难同胞 来生一起走 HDU 2189 普通生成函数 BZOJ3028 食物 普通生成函数 推导 欧拉降幂 E CountingSequ

    2026年3月7日
    3
  • does have any_has many

    does have any_has many使用京东云OSS的外链访问(自己程序拼的外链,并非是OSS服务器上给定的外链).访问报如下错误ThisXMLfiledoesnotappeartohaveanystyleinformationassociatedwithit.Thedocumenttreeisshownbelow.<Error> <statusCode>403</statusCode> <Code>AccessDenied</Code&g

    2026年1月16日
    5
  • FilterChain的详解

    FilterChain的详解FilterChain 的作用过滤器链作用 当一个 filter 收到请求的时候 调用 chain doFilter 才可以访问下一个匹配的 filter 若当前的 filter 是最后一个 filter 调用 chain doFilter 才能访问目标资源多个 filter 的执行顺序是由 web xml 中 filter mapping 的位置决定的 dispatcherRE 默认值 过滤从浏览器发送过来的请求和重定向不过滤转发 FORWARD 只过滤转发过来的请求了解 INCLUDE 只过滤包含过来的请求 ER

    2026年3月17日
    2
  • Python中两种UnboundLocalError: local variable ‘xxx’ referenced before assignment情况的解决方法

    Python中两种UnboundLocalError: local variable ‘xxx’ referenced before assignment情况的解决方法  1)在子程序中对全局变量的操作,比如val=9deftest(flag):   ifflag:     val=1   else:     print’Error’   returnval test(0)错误提示:UnboundLocalError:localvariable’val’referencedbefo…

    2022年6月17日
    50
  • mix的中文是什么_mix是最小的意思吗

    mix的中文是什么_mix是最小的意思吗《mixup:BEYONDEMPIRICALRISKMINIMIZATION》2017(ICLR2018),HongyiZhangetal.Mixup,MIT和FAIRQ:为什么dataaugmentation是理解为控制模型复杂度?A:准确地说,我觉得dataaugmentation既不能简单地理解为增加trainingdata,也不能简单地理解为控制模型复杂度,而是两种效果兼而有之。考虑图像识别里常用的改变aspectratio做dataaugmentation的

    2026年3月3日
    7
  • 关于abiFilters的使用「建议收藏」

    关于abiFilters的使用「建议收藏」关于abi兼容的选择。abiFilters在app的使用

    2022年5月21日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号