问题背景
今天在写一个判断语句的时候,突然出现了一个空指针异常,其伪代码如下所示
//实体类
@Data
public class DemoBean{
private Integer demoType;
private String name;
}
--------------------------------
//业务类1 DemoService1.class
...
DemoBean demoBean=demoService.getDemoBean();
demoService2.saveData(demoBean==null?"":demoBean.getName(),demoBean==null?0:demoBean.getDemoType());
...
----------------------------------
//业务类2:DemoService2.class
public void saveData(String name,Integer demoType){
//处理业务
...
}
问题发现
乍一看上述的代码似乎没有什么问题(忽略参数繁琐以及其他问题,这里只是为了展示空指针产生的原因),如果demoBean里面的字段都有值的话,上面的代码没有任何问题。但是如果demoBean的结构是如下代码所示
demoBean={"name":"哈哈哈","beanType:null}
猜测一下会产生什么问题?会产生空指针,是不是一脸懵,看代码判断没问题怎么就会产生空指针了。。。。
原因分析
我们只是看源代码估计是不好理解,但是如果把编译之后的class文件反编译再去看的话估计就很好理解了,下面代码是反编译之后的结果
this.demoService2.saveData((demoBean==null)?"":demoBean.getName(),Integer.valueOf((demoBean==null)?0:demoBean.getDemoType().intValue()));
那么为什么会产生空指针就显而易见了,修改方法就是把0用包装类包装一下:
Integer.valueOf(0);
注:本文所用java版本为jdk1.8-0_301,其他编译版本未尝试