某日,同事给我展示了一块代码,问我有没有什么问题。(代码如下 代码块1):

int i = 1;
Boolean a = null;
boolean b = false;
System.out.println(i == 1 ? a : b);

集智慧与美貌于一身的我一眼就发现了其中的端倪:当然会报 NPE 了!

但是如果代码变成这样的呢(如下 代码块2)?

int i = 1;
boolean a = true;
Boolean b = null;
System.out.println(i == 1 ? a : b);

上述代码块就是正常的。

为什么呢?

这就涉及到了Java中 三目运算符 和 自动装箱/拆箱 的问题了。

代码块1会报错是因为条件满足,取 a 的值。在取 a 的值时,三目运算符中既有基本类型,又有引用类型;JVM会帮我们把引用类型的数据转换为基本类型。通过查看 class 文件看到如下代码(代码块3):

int i = 1;
Boolean a = null;
boolean b = false;
System.out.println(i == 1 ? a.booleanValue() : b);

因为 a 是引用类型,此时调用 a 的方法就会报NPE了。

代码块2为什么不会报错呢?

此时三目运算符中的条件满足,直接就取 a 的值了,因为 a 是基本类型的,直接就拿来用了,所以程序正常。可以看到 class 文件如下(代码块4):

int i = 1;
boolean a = true;
Boolean b = null;
System.out.println(i == 1 ? a : b.booleanValue());

但在实际的业务场景中,我们的代码不会上上述一样是 i == 1 的写法,大部分情况下是动态判断的。如何避免踩进上述的坑中呢?

其实要解决这个问题也很简单,就是不让JVM帮我们拆箱。即把 a 和 b 两个对象都改为 Boolean 或 boolean,只要两个对象统一就好了。

避免采坑的代码:

int i = 1;
Boolean a = Boolean.TRUE;
Boolean b = Boolean.FALSE;
System.out.println(i == 1 ? a : b);

int i = 1;
boolean a = true;
boolean b = false;
System.out.println(i == 1 ? a : b);

总结:

不止 Boolean/boolean 有这个问题,像 Byte / byte、Integer / int、Short / short、Long / long、Character / char、Float / float、Double / double 都会有这样的问题。只要代码规范一点,就不会坑到队友啦  ╮( ̄▽ ̄)╭

最后祝大家码出好心情,码出幸福人生!

Java之三目运算符相关推荐

  1. java使用三目运算符来判断成绩

    **题目:**利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 程序分析:(a>b)?a:b这是条件运算符的基本例子. ...

  2. java中三步表达式,Java中三目运算符之类型转换

    文章目录 1. 前言2. 三目运算符使用3. 类型转换3.1 尝试着分析一下 4. 结论与思考5. 源码参考 1. 前言 相信各位 Javaer 对于三目运算符(三元运算符)都不陌生,较多情况下使用三 ...

  3. Java:三目运算符

    Java中的三目运算符相当于简化的If-else-表达式. 1).语法 boolean 表达式1 :表达式2: 2). 如果boolean 为true,则整个结果为表达式1 的结果 如果boolean ...

  4. java中三目运算符详解

    对于有些选择分支结构,可以使用简单的条件运算符来代替. 如: if(a<b)     min=a; else     min=b; 可以用下面的条件运算符来处理 min=(a<b)?a:b ...

  5. java if 三目运算符_if-else和三元运算符的不同行为

    我在VS2010-SP1中有下面的类,三元运算符和if-else似乎对getname方法下面的代码有不同的工作方式 template class StringBuf{ public: StringBu ...

  6. java布尔三目运算符_Java关系运算符,boolean运算符,三元运算符

    &&和||都属于短路运算,若第一个表达式能够确定整个表达式的值,第二个表达式不会被运算.以下两段ifelse的效果是一样的. ---------------------------- ...

  7. 【自学Java】Java三目运算符

    Java三目运算符 Java三目运算符教程 在 Java 语言 中,有一种语言可以等价于使用 if-else 进行变量的赋值操作.它就是三目运算符. Java语言三目运算符详解 语法 Object r ...

  8. 三目运算符_Java中的三目运算符

    某日,同事给我展示了一块代码,问我有没有什么问题.(代码如下 代码块1): int i = 1; Boolean a = null; boolean b = false; System.out.pri ...

  9. Java实训-9月月考

    单选题 1.下列程序运行后,输出结果是( ) public class Point { private int x, y;Point (int x, int y) {this.x = x;this.y ...

最新文章

  1. Vue.js 官方团队成员霍春阳新作,深入解析 Vue.js 设计细节
  2. office2007的界面
  3. 50个Android开发人员必备UI效果源码[转载]
  4. C#中DateTime的缺陷与代替品DateTimeOffset
  5. mysql sysdate本周_mysql 查询当天、本周,本月,上一个月的数据
  6. 【写作技巧】计算机应用技术毕业论文范文
  7. sublime 常用插件列表
  8. 通达信公式改成python_通达信 修改为选股公式
  9. 【小程序源码】自带接口短视频去印工具箱
  10. Win10 资源管理器导航栏设置
  11. 马斯克是全人类的?他旗下有9家公司,特斯拉被评为最没技术含量
  12. 计算机中没有汉字输入,电脑没有了输入法无法输入汉字,是为什么??
  13. 烤仔建工承建,著名画家孙天骄的元宇宙美术馆即将开门迎客
  14. 在移动硬盘中安装win10和macos双系统
  15. 智慧水务信息化系统的意义
  16. HDFS DataNode高密度存储机型的探索尝试
  17. 遗传算法关于多目标优化python(详解)
  18. USB NCM usbnet 枚举流程代码分析
  19. 【通州爆料】通州台湖一村被征地建设轻轨L2线
  20. 面渣逆袭:计算机网络六十二问,三万字图文详解

热门文章

  1. 基于STM32单片机的篮球计时记分器proteus仿真原理图PCB
  2. insmod等模块命令
  3. 安装autoconf
  4. Java后端返回Long类型数据与前端展示不一致(精度丢失)
  5. Oracle数据库学习基础
  6. 智能电话机器人(各个版本机器人部署)
  7. 使用软路由实现智能Qos
  8. 基于ADS1298的心电图仪
  9. 【Python】python的加、减、乘、除、取整、取余计算
  10. Android智能电视焦点控制