前言
在写项目代码的时候,突然遇到了空指针,真是百思不得其解!由于项目原因这里使用了伪代码了,如下:
public class Man {
public static void main(String[] args) {
Man man = new Man();
Long id = man != null ? man.getId() : -1L;
System.out.println("id = " + id);
}
private String name;
private Long id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
你们觉得输出的结果是什么?大部分人可能跟我一样,觉得应该是 null
,对吧?
但是,真是的结果确是保空指针异常了,如下:
原因是为什么呢?
原因是编译后包装类型会拆箱: Long id = man != null ? man.getId() : -1L
; 反编译后变为:Long id = man != null ? man.getId().longValue : -1.longValue
man.getId() 为空对象,调用.longValue()
自然会引用空指针异常!
正确的写法应该是: Long id = man != null ? man.getId() : Long.valueOf(-1)
;
将基本类型**-1L** 改为 包装类型Long.valueOf(-1)
,这样就不会发生拆箱,也就不会发生空指针引用。
希望大家使用三目运算符 且 两边类型不一致时,一定要引起注意!!!