一、空指针问题
最近发现了一例Integer自动拆箱导致的空指针异常,先上代码:
final dataCollectionDTO dataCollectionDTO = new DataCollectionDTO();
if (dataCollectionDTO.getOperationType() == OperationTypeEnum.UPDATE.getValue()) {
// do something...
}
代码中dataCollectionDTO.getOperationType是Integer类型,值为null。OperationTypeEnum.UPDATE.getValue()是int类型,值为2。
为什么是报空指针而不是返回false呢?
当左边是Integer类型,右边是int类型时,==对比的是值,这个时候会自动对左边的null进行拆箱操作,当自动拆箱的时候,就会发生空指针异常。
二、解决方案
那么这类问题如何解决呢,可以使用Objects.equals方法避免空指针异常,代码如下:
final dataCollectionDTO dataCollectionDTO = new DataCollectionDTO();
if (Objects.equals(dataCollectionDTO.getOperationType(), OperationTypeEnum.UPDATE.getValue())) {
// do something...
}
Objects.equals方法的内部代码是通过先把入参装箱,再比较的方式避免了拆箱的空指针。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}