前言
作为一名Java菜鸟选手,经常因为会不会出现空指针异常而烦心。空指针带来的烦恼不必多说,轻则被喷排查代码半小时,重则奖金绩效减半,四舍五入等于今年白干。
话不多说,现在就来总结一下经常出现空指针异常的场景。
正式开始前,看看美女先。哈哈哈哈。
场景类型
1、数据库空数据
数据库存null值,其实还是比较容易发现的。但是安全保险,还是建议还是先确认下当前所要使用字段的含义。同时去数据库中抽样遍历下所要使用的字段。注意要,不要只关注一张表,最好涉及到的表都要看下。记住作为一名CRUD选手,也要时刻保持一个谨慎心的。
2、容器空指针
作为一名CRUD男孩你说你不适用容器,那我是不信的。直接上代码,
//1、本身为空。
List<String> list = null;
//2、map本身key不存在,对于返回值没有校验,直接使用。
Map<String,String> map = new HashMap<>();
map.put("1","1");
String s = map.get(2);
// s为null,调用其方法必然空指针异常
s.length();
建议:1、使用上层业务返回的容器时,一定要进行空指针校验。可以自己写一个Util,或者使用开源打Util包进行判断。
3、xx.valueOf()
在接口调用的过程中,会存在类型不同,需要转换的场景。最常见的是:将Long类型,转换成String类型,这时候便会调用
String.valueOf(xx);。你不保证别人传递给你的参数会不会有脏数据,即使已经约定好不能传空数据。但是一定要记住,别人的服务一定是不可靠的,可靠性要由自己来保证。自己的代码自己不负责,想当老王么。
Long temp = null;
String.valueOf(temp ==null ? "" : temp);
4、注解注入
对于Java的项目,现在基本都基于Spring的。这就避免不了使用Spring提供的IOC功能。记住,当使用注解(@Autowired等等)进行对象注入的时候,一定要先将类提供给IOC进行管理。可以通过注解方式(@Service等等)也可以使用配置文件的方式。推荐使用注解的方式,简单便于维护。
@Autowired
private static Role role;
public static void main(String[] args) {
System.out.println(role.getDesc());
}
控制台输入:
Exception in thread "main" java.lang.NullPointerException
at com.pinfine.test.Test02.main(Test02.java:20)
总结
空指针是最让头疼的事情,你不知道什么时候会给你来个NullPointerException。上述场景只是最常见的情况,还会有很多业务场景会出现意想不到的惊喜,我会继续补充遇到空指针的场景。因此,要养成习惯coding的时候,一定要时刻提醒自己,这个对象会是null么,我要不要校验一下他呢。