三元表达式引发的空指针问题🌟
知识回顾
三目运算符大家都很熟悉了:
<表达式1> ? <表达式2> : <表达式3>
要注意的就是:一个三元表达式从不会既计算 <表达式 2>,又计算 <表达式 3>。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d : e 将按 a ? b : (c ? d : e) 执行。
再来回顾下自动拆箱和装箱机制,Java 通过这种机制使得包装类和基本数据类型之间的转换更加方便:
- 装箱:将基本数据类型转换成包装类(每个包装类的构造方法都可以接收各自数据类型的变量)。
- 拆箱:从包装类之中取出被包装的基本类型数据(使用包装类的 xxxValue 方法)。
下面以 Integer 为例,来看看 Java 内置的包装类是如何进行拆装箱的:
Integer obj = new Integer(10); // 装箱
int temp = obj.intValue(); // 拆箱
这种形式的代码是 JDK 1.5 以前的,JDK 1.5 之后,Java 设计者为了方便开发提供了自动装箱(Autoboxing)与自动拆箱的机制,并且可以直接利用包装类的对象进行数学计算。
还是以 Integer 为例,来看看自动拆装箱的过程:
Integer obj = 10; // 自动装箱. 基本数据类型 int -> 包装类 Integer
int temp = obj; // 自动拆箱. Integer -> int
obj ++; // 直接利用包装类的对象进行数学计算
System.out.println(temp * obj);
基本数据类型到包装类的转换,不需要像上面一样使用构造函数,直接 =
就完事儿;同样的,包装类到基本数据类型的转换,也不需要手动调用包装类的 xxxValue 方法了,直接 =
就能完成拆箱。这也是将它们称之为自动的原因。
来看看这段代码反编译后的文件,底层到