什么是 空指针?
空指针,英文名 NullPointerException是RuntimeException的一个子类,在编译时期不会触发,是这是运行时的异常错误,就是空引用。
java空指针异常就是引用变量本身为null,却调用了null的方法,这个时候就会出现空指针异常。
空指针异常的原因?
java.lang.NullPointerException出现的几种原因:
1、变量未初始化
假设有一个student类,有属性name。
Student a; String b = a.name;
这个时候就会报错,因为a为空的,解决办法就是让a指向一个对象。
Student a = new Student();
2、接口类型的对象没有用具体的类初始化
比如Map接口:
Map map // 会报错 Map map = new Map(); //则不会报错了
比如:List接口;
List list;会报错 List list= new ArrayList();则不会报错了
3、当一个对象的值为空时,你没有判断为空的情况
比如:
if(rb!=null && rb!="")
改成:
改成: if(rb==null); if(rb!==null&&rb!="") 或者if("").equals(rb))
4、字符串与文字的比较
比如,如下会出现异常:
String str = null; if(str.equals(“Test”)){ //这里的代码将不会被触发,因为会抛出java.lang.NullPointerException异常。 }
5、优先使用String.valueOf()方法代替toString()
当程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。
如果你的对象的引用等于null,NullPointerException则会抛出,使用静态String.valueOf方法,该方法不会抛出任何异常并打印”null”。
6、数组为 null 时,访问数组长度
空指针的解决办法?
1、使用instanceof 操作符
第一种使用instanceof 操作符,即使对象的引用为null,instanceOf操作符可使用。
当引用为null时,instanceof操作符返回false,而且不会抛出NullPointerException,比如:
String str = null; if(str instanceof null) { log.error(.......) }
2、使用 null 安全的方法和库
开源库的方法通常都了非空校验,例如 Apache common 库中的 StringUtils 工具类中的 isBlank()、isNumeric() 等方法,使用时不必担心 NPE。
比如:
System.out.println(StringUtils.isBlank(null)); System.out.println(StringUtils.isNumeric(null));
3、使用 @NotNull 和 @Nullable 注解
@NonNull可以标注在方法、字段、参数之上,表示对应的值不可以为空 @Nullable可以标注在方法、字段、参数之上,表示对应的值可以为空
4、避免不必要的装箱拆箱
如果包装对象为 null,在拆箱时容易发生 NPE。
比如:
Integer integer = null; int i = integer; System.out.println(i);
5、定义合理的默认值
定义成员变量时提供合理的默认值,比如:
private List<String> list = new ArrayList<>(); private String s = "";
6、使用空对象模式
空对象是设计的一种特殊实例,为方法提供默认的行为。
比如:
Collections中的 EMPTY_List
Collections中的 EMPTY_List,我们仍能使用它的 size(),会返回 0,而不会抛出 NullPointerException。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》