Exception in thread "main" java.lang.NullPointerException
at com.xx.xx.xx.xx.xx.xxx.main(CancelRequestHandler.java:55)
StudentDTO dto = new StudentDTO ();
try {
dto.setId(null);// Id是封装类
throw new Exception();
} catch (Exception e) {
log.info("thow exception ,param:{}",dto != null ? dto.getId() : 0,e);
}
当层层调用到这一段的时候,应该很多人肉眼是看不出问题的。
其实这个是编译class后拆装箱出现的问题,Id是封装对象,三元表达式里面有基本类型0,
编译后三元表达式的处理是这样子的,
Long.valueOf(dto != null ? dto.getId().longValue() : 0L)
编译器进行了编译优化,Long.valueOf不能转换null,所以出现NPE.
建议:catch里面用占位特性,不要去判空赋值,尤其是封装类和基本类型一起使用