阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

NullPointerException

29次阅读
没有评论

共计 1995 个字符,预计需要花费 5 分钟才能阅读完成。

在所有的 RuntimeException 异常中,Java 程序员最熟悉的恐怕就是 NullPointerException 了。

NullPointerException即空指针异常,俗称 NPE。如果一个对象为null,调用其方法或访问其字段就会产生NullPointerException,这个异常通常是由 JVM 抛出的,例如:

// NullPointerException
public class Main {public static void main(String[] args) {String s = null;
        System.out.println(s.toLowerCase());
    }
}

指针这个概念实际上源自 C 语言,Java 语言中并无指针。我们定义的变量实际上是引用,Null Pointer 更确切地说是 Null Reference,不过两者区别不大。

处理 NullPointerException

如果遇到 NullPointerException,我们应该如何处理?首先,必须明确,NullPointerException 是一种代码逻辑错误,遇到 NullPointerException,遵循原则是早暴露,早修复,严禁使用catch 来隐藏这种编码错误:

// 错误示例: 捕获 NullPointerException
try {transferMoney(from, to, amount);
} catch (NullPointerException e) {
}

好的编码习惯可以极大地降低 NullPointerException 的产生,例如:

成员变量在定义时初始化:

public class Person {private String name = "";
}

使用空字符串 "" 而不是默认的 null 可避免很多 NullPointerException,编写业务逻辑时,用空字符串"" 表示未填写比 null 安全得多。

返回空字符串""、空数组而不是null

public String[] readLinesFromFile(String file) {if (getFileSize(file) == 0) {// 返回空数组而不是 null:
        return new String[0];
    }
    ...
}

这样可以使得调用方无需检查结果是否为null

如果调用方一定要根据 null 判断,比如返回 null 表示文件不存在,那么考虑返回Optional<T>

public Optional<String> readFromFile(String file) {if (!fileExist(file)) {return Optional.empty();}
    ...
}

这样调用方必须通过 Optional.isPresent() 判断是否有结果。

定位 NullPointerException

如果产生了 NullPointerException,例如,调用a.b.c.x() 时产生了NullPointerException,原因可能是:

  • anull
  • a.bnull
  • a.b.cnull

确定到底是哪个对象是 null 以前只能打印这样的日志:

System.out.println(a);
System.out.println(a.b);
System.out.println(a.b.c);

从 Java 14 开始,如果产生了 NullPointerException,JVM 可以给出详细的信息告诉我们null 对象到底是谁。我们来看例子:

public class Main {public static void main(String[] args) {Person p = new Person();
        System.out.println(p.address.city.toLowerCase());
    }
}

class Person {String[] name = new String[2];
    Address address = new Address();}

class Address {
    String city;
    String street;
    String zipcode;
}

可以在 NullPointerException 的详细信息中看到类似 ... because "<local1>.address.city" is null,意思是city 字段为null,这样我们就能快速定位问题所在。

这种增强的 NullPointerException 详细信息是 Java 14 新增的功能,但默认是关闭的,我们可以给 JVM 添加一个 -XX:+ShowCodeDetailsInExceptionMessages 参数启用它:

java -XX:+ShowCodeDetailsInExceptionMessages Main.java

小结

NullPointerException是 Java 代码常见的逻辑错误,应当早暴露,早修复;

可以启用 Java 14 的增强异常信息来查看 NullPointerException 的详细错误信息。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1995字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中