直接看代码:
public static void main(String[] args) throws SQLException {
Integer a = 1;
Integer b = 1;
Integer c = null;
Integer d = false ? a * b : c;
}
这个代码是否有问题?
答案:是有的,空指针异常NPE,
为什么呢?直接给Integer 赋空是不会出问题的啊。如:Integer c = null;
这个就涉及到Integer的拆箱和装箱了。
看似 false 把 a*b 短路(不会执行 a * b)了。
但是实际上程序执行时,还是会对a*b进行运算,这里就会自动拆箱 => c也会自动拆箱。
null 拆箱就会报错。
原错误代码:
public static void main(String[] args) throws SQLException {
Account a = new Account();
a.setAge(1);
Integer b = (a != null) ? a.getGender() : 1;
System.out.println(b);
}
这个逻辑相同:看似 b = null; 但是这里用了 1(int),前面就会跟着自动拆箱
public static void main(String[] args) throws SQLException {
Float a = 1F;
Float b = 2F;
Float c = null;
// 这里会不会空指针
Float d = false ? 1F : c;
System.out.println(d);
}
我们来看看编译后的样子:
奇怪吧!