NullPointerException3-21

简介: NullPointerException3-21

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

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

// NullPointerException

Run

指针这个概念实际上源自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,原因可能是:

a是null;

a.b是null;

a.b.c是null;

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

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

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

Run

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

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

java -XX:+ShowCodeDetailsInExceptionMessages Main.java


相关文章
Mockito框架抛出NullPointerException
一文详细讲解Mockito框架是怎么抛出NullPointerException的整个过程和解决方式。
5932 0
|
4月前
|
SQL Java 数据库连接
ResultSet
ResultSet
28 0
|
存储 Java 开发者
使用Optional优雅避免空指针异常
在编程世界中, 空指针异常(NullPointerException) 无疑是我们最常遇到的"罪魁祸首"之一。它像一片隐蔽的地雷,静静地等待着我们不小心地踏入,给我们的代码带来潜在的威胁。这种问题虽然看似微小,但却无法忽视。甚至可能对整个程序的稳定性产生重大影响。
48 0
|
Java
如何优雅的避免Java中:NullPointerException(空指针异常)
如何优雅的避免Java中:NullPointerException(空指针异常)
95 0
|
Java 开发者
Java:Optional处理NullPointerException空指针异常的利器
Java:Optional处理NullPointerException空指针异常的利器
147 0
WARN FileInputDStream:87 - Error finding new filesjava.lang.NullPointerException报错为什么
WARN FileInputDStream:87 - Error finding new filesjava.lang.NullPointerException报错为什么
|
安全 Java 程序员
每日一BUG NullPointerException
每日一BUG NullPointerException
空指针异常NullPointerException解决
空指针异常NullPointerException解决
132 0
@NotNull、@NotEmpty、@NotBlank的区别
@NotNull、@NotEmpty、@NotBlank的区别
257 0
|
Java 测试技术 API
Java8的Stream方法findAny空指针异常(NullPointerException)实例对比
Java8的Stream方法findAny空指针异常(NullPointerException)实例对比
689 0