三目运算符的一个坑-自动拆箱
来源:互联网 发布:照片图库 mac 密码 编辑:程序博客网 时间:2024/06/05 20:02
问题描述:
Integer a = null;
Integer b = true ? a : 0;
执行这个三目表达式后, b等于多少, 理解原因;
执行以上两行代码
/**
* Created by ryan01.peng on 2017/7/25.
*/
public class TestTernaryOperator {
public static void main(String[] args) {
Integer a = null;
Integer b = true ? a : 0; //这里是第10行,报错行
b.intValue();System.out.println(b);
}
}
会导致报错,如下
Exception in thread "main" java.lang.NullPointerException
at com.vip.vcp.ryan.zhaunzheng.leBasic.TestTernaryOperator.main(TestTernaryOperator.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
分析:这里的报错出现在三目运算符所在的一行,而不是使用b的最后一行。说明这个NullPointerException并不是Integer b引起的,而是由于三目运算符所在行引起的。
这里空指针异常的原因是: 三目运算中只要后面两个元素是不同的类型,涉及到类型转换,那么编译器会往下(基本类型)转型,再进行运算。 就是说,如果运算中有int和Integer,Integer会先转成int再计算,在拆箱的过程中a=null转换成int,导致了NullPointerException。
我们将Integer b =true? a :0; 换为Integer b =true? a :new Integer(0);则不会抛出异常了。输出null
以后开发中避免的措施:
1. 对对象进行使用或者操作时都先验空,然后再进行操作处理。
2. 三目运算符后最好使用同种类型的对象。
阅读全文
0 0
- 三目运算符的一个坑-自动拆箱
- 通过三目运算符来看JAVA的自动拆箱和装箱
- JDK自动拆箱下,三目运算符的潜规则
- Java自动装/拆箱下,三目运算符的潜规则
- JDK自动拆箱下,三目运算符的潜规则
- Java三目运算符数值类型的自动转换
- 三目运算符报空指针,JDK自动拆箱
- 三目运算符----类型自动提升
- 三目运算符---类型自动提升
- 三目运算符下的空指针异常和自动拆装箱
- 使用三目运算符时注意的一个问题
- 一个三目运算符问题
- C语言中唯一的一个三目运算符(条件运算符)
- c++三目运算符的坑
- Java进行三目运算时的自动类型转换
- 使用三目运算符:绑定控件内容时的自动判断
- java--三目运算符 类型自动提升
- C语言中“?:”是一个三目运算符(唯一的)
- (嵌入式)关于arm中的存储控制器(三)终!
- Appium_swipe针对app模拟手机屏幕上下左右滑动操作方法
- [学习笔记] KMP算法的Next数组怎么求
- 用Python解析json数据
- JavaScript中级 (三) ----AJAX
- 三目运算符的一个坑-自动拆箱
- Linux 2.6.19.x内核编译配置选项简介
- ReduceByKey算子理解
- 正向代理与反向代理
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
- POJ
- 1084: [SCOI2005]最大子矩阵
- CS231n-assignment1-KNN篇
- Linux用户切换到root后运行图形程序报错(*GLib-GIO-CRITICAL **)