Java NullPointerException原因及解决(6大解决办法)

Java NullPointerException原因及解决(6大解决办法)-mikechen

什么是 NullPointerException?

NullPointerException是RuntimeException的一个子类,在编译时期不会触发,是这是运行时的异常错误,俗称NPE。

Java NullPointerException原因及解决(6大解决办法)-mikechen

NullPointerException ,翻译过来就是空指针异常,就是空引用。

java空指针异常就是引用变量本身为null,却调用了null的方法,这个时候就会出现空指针异常。

 

NullPointerException异常的原因?

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 时,访问数组长度

 

NullPointerException的解决办法?

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面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法