0
点赞
收藏
分享

微信扫一扫

[Java]如何在工作中避免空指针异常(NullPointerException)

女侠展昭 2021-12-29 阅读 118

什么是空指针异常?

空指针异常指的是当前的对象指向了一段null的内存区域,而开发者用null进行了其他操作,引发的JVM堆栈异常。
编译时程序无法推断出这个对象是否会为null,而在程序运行的时候,它执行了null所不具备的能力,这个时候JVM会向你抛出NullPointException,告诉你,这个地方的引用是空的,无法继续往下执行了。

经典案例

User

package exception;

import lombok.Data;

import java.util.Collections;
import java.util.List;

@Data
public class User {
    private String userName;
    private String password;
    private Integer age;

    /**
     * 返回空集合,用于演示NPE
     * @return
     */
    public static List<User> getNullInstances(){
        return null;
    }
}

  • 业务对象为空,导致程序报NPE
User user = getDataById(100);
// 如果根据id:100无法查询到具体的User实例,那么此时的user就是null,那么null.getxxx()就会触发NPE了
String userName = user.getUserName();
  • 集合操作时没有进行判空,导致程序报NPE
        List<User> userList = User.getNullInstances();
        System.out.println(userList.size());
  • 回收资源的时候,没有进行判空处理
        BufferedReader bufferedReader = null;
        try {
            File file = new File("C:\\Users\\95152\\Desktop\\sql.txt");
            FileReader fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            String readLine = bufferedReader.readLine();
            System.out.println(readLine);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 这里的bufferedReader可能为空,直接调用close可能会报错
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

高发区域

  • 进行数据库查询操作时,未进行判空就直接使用,容易引发NPE
  • 远程调用或者Http调用第三方接口时,未进行判空就进行了下一步处理,容易引发NPE
  • 从中间件获取数据时,未进行判空就直接处理,容易引发NPE
  • 集合操作时,使用了null作为了操作目标,容易引发NPE
  • toString()

如何保持代码的鲁棒性,避免NPE?

  • 对对象或者集合进行操作时,需要检验是否会出现空的情况,对对象或者集合判空校验。
  • 如果编写了工具类有定义返回的结果集,那么不要直接返回null,抛出异常或者返回空对象或许更加好
  • 使用Optional
  • 使用断言
  • String可以使用StringUtils.isBlank()进行判空,集合可以使用CollectionUtils.isEmpty()进行判空
  • JDK7提供了一个Objects类,使用Objects.isNull()可以帮助你写出可读性更友好的代码
举报

相关推荐

0 条评论