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。

  1. Student a;
  2. String b = a.name;

这个时候就会报错,因为a为空的,解决办法就是让a指向一个对象。

  1. Student a = new Student();

 

2、接口类型的对象没有用具体的类初始化

比如Map接口:

  1. Map map // 会报错
  2.  
  3. Map map = new Map(); //则不会报错了

比如:List接口;

  1. List list;会报错
  2. List list= new ArrayList();则不会报错了

 

3、当一个对象的值为空时,你没有判断为空的情况

比如:

  1. if(rb!=null && rb!="")

改成:

  1. 改成:
  2. if(rb==null);
  3. if(rb!==null&&rb!="") 或者if("").equals(rb))

 

4、字符串与文字的比较

比如,如下会出现异常:

  1. String str = null;
  2.  
  3. ifstr.equals(“Test”)){
  4.  
  5. //这里的代码将不会被触发,因为会抛出java.lang.NullPointerException异常。
  6.  
  7. }

 

5、优先使用String.valueOf()方法代替toString()

当程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。

如果你的对象的引用等于null,NullPointerException则会抛出,使用静态String.valueOf方法,该方法不会抛出任何异常并打印”null”。

 

6、数组为 null 时,访问数组长度

 

NullPointerException的解决办法?

1、使用instanceof 操作符

第一种使用instanceof 操作符,即使对象的引用为null,instanceOf操作符可使用。

当引用为null时,instanceof操作符返回false,而且不会抛出NullPointerException,比如:

  1. String str = null;
  2. if(str instanceof null) {
  3. log.error(.......)
  4. }

 

2、使用 null 安全的方法和库

开源库的方法通常都了非空校验,例如 Apache common 库中的 StringUtils 工具类中的 isBlank()、isNumeric() 等方法,使用时不必担心 NPE。

比如:

  1. System.out.println(StringUtils.isBlank(null));
  2. System.out.println(StringUtils.isNumeric(null));

 

3、使用 @NotNull 和 @Nullable 注解

  1. @NonNull可以标注在方法、字段、参数之上,表示对应的值不可以为空
  2. @Nullable可以标注在方法、字段、参数之上,表示对应的值可以为空

 

4、避免不必要的装箱拆箱

如果包装对象为 null,在拆箱时容易发生 NPE。

比如:

  1. Integer integer = null;
  2. int i = integer;
  3. System.out.println(i);

 

5、定义合理的默认值

定义成员变量时提供合理的默认值,比如:

  1. private List<String> list = new ArrayList<>();
  2. private String s = "";

 

6、使用空对象模式

空对象是设计的一种特殊实例,为方法提供默认的行为。

比如:

  1. Collections中的 EMPTY_List

Collections中的 EMPTY_List,我们仍能使用它的 size(),会返回 0,而不会抛出 NullPointerException。

 

评论交流
    说说你的看法
欢迎您,新朋友,感谢参与互动!