Java之三目运算符
某日,同事给我展示了一块代码,问我有没有什么问题。(代码如下 代码块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之三目运算符相关推荐
- java使用三目运算符来判断成绩
**题目:**利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 程序分析:(a>b)?a:b这是条件运算符的基本例子. ...
- java中三步表达式,Java中三目运算符之类型转换
文章目录 1. 前言2. 三目运算符使用3. 类型转换3.1 尝试着分析一下 4. 结论与思考5. 源码参考 1. 前言 相信各位 Javaer 对于三目运算符(三元运算符)都不陌生,较多情况下使用三 ...
- Java:三目运算符
Java中的三目运算符相当于简化的If-else-表达式. 1).语法 boolean 表达式1 :表达式2: 2). 如果boolean 为true,则整个结果为表达式1 的结果 如果boolean ...
- java中三目运算符详解
对于有些选择分支结构,可以使用简单的条件运算符来代替. 如: if(a<b) min=a; else min=b; 可以用下面的条件运算符来处理 min=(a<b)?a:b ...
- java if 三目运算符_if-else和三元运算符的不同行为
我在VS2010-SP1中有下面的类,三元运算符和if-else似乎对getname方法下面的代码有不同的工作方式 template class StringBuf{ public: StringBu ...
- java布尔三目运算符_Java关系运算符,boolean运算符,三元运算符
&&和||都属于短路运算,若第一个表达式能够确定整个表达式的值,第二个表达式不会被运算.以下两段ifelse的效果是一样的. ---------------------------- ...
- 【自学Java】Java三目运算符
Java三目运算符 Java三目运算符教程 在 Java 语言 中,有一种语言可以等价于使用 if-else 进行变量的赋值操作.它就是三目运算符. Java语言三目运算符详解 语法 Object r ...
- 三目运算符_Java中的三目运算符
某日,同事给我展示了一块代码,问我有没有什么问题.(代码如下 代码块1): int i = 1; Boolean a = null; boolean b = false; System.out.pri ...
- Java实训-9月月考
单选题 1.下列程序运行后,输出结果是( ) public class Point { private int x, y;Point (int x, int y) {this.x = x;this.y ...
最新文章
- Vue.js 官方团队成员霍春阳新作,深入解析 Vue.js 设计细节
- office2007的界面
- 50个Android开发人员必备UI效果源码[转载]
- C#中DateTime的缺陷与代替品DateTimeOffset
- mysql sysdate本周_mysql 查询当天、本周,本月,上一个月的数据
- 【写作技巧】计算机应用技术毕业论文范文
- sublime 常用插件列表
- 通达信公式改成python_通达信 修改为选股公式
- 【小程序源码】自带接口短视频去印工具箱
- Win10 资源管理器导航栏设置
- 马斯克是全人类的?他旗下有9家公司,特斯拉被评为最没技术含量
- 计算机中没有汉字输入,电脑没有了输入法无法输入汉字,是为什么??
- 烤仔建工承建,著名画家孙天骄的元宇宙美术馆即将开门迎客
- 在移动硬盘中安装win10和macos双系统
- 智慧水务信息化系统的意义
- HDFS DataNode高密度存储机型的探索尝试
- 遗传算法关于多目标优化python(详解)
- USB NCM usbnet 枚举流程代码分析
- 【通州爆料】通州台湖一村被征地建设轻轨L2线
- 面渣逆袭:计算机网络六十二问,三万字图文详解