如何修复NullPointerException异常

数字魔盒
java.lang.NullPointerException 是JAVA中最容易出现的异常,也是非常困扰编程新手的问题。本文对空指针异常的发生原因进行说明,并对如何解决空指针异常给出了快捷方法。

什么是空指针异常

NullPointerExceptions 是当您尝试使用未指向任何对象的引用时,发生的异常。对空引用调用方法或尝试访问空引用的字段将触发NullPointerException。比如如下代码:

public class Dm2box {
    public static void main(String[] args) {
        Object obj;
        obj.hashCode();
    }
}

上述代码会在会在obj.hashCode()执行时抛出空指针异常,其原因是obj变量还未指向任何实例对象。

第二行声明了一个类型为Object的变量obj,但它实际上并不包含原始值,只包含一个指针,由于您还没有说要指向什么,Java 将其设置为null,这意味着“我没有指向任何内容”。在第三行进行hashCode()方法执行时,由于该变量并为指向实际内存中的对象,所以会导致无法执行任何方法并抛出空指针异常。

上述这就像在一个班级中,还没有让学生就坐,却让第一排第一列座位上的学生回答问题,这时座位上还没有对应的学生,自然也就无法有人回答问题,最终导致回答问题这个行为因为座位上无人从而无法执行。如上的例子中,班级就是内存空间;学生就是内存中的对象;座位编号就是变量obj;回答问题就是hashCode()方法;没有对应人能够执行问题回答就是空指针异常。

编写时如何避免

因为NullPointerExceptions继承自RuntimeExcetion,所以其无需在方法声明中进行明确描述。在源码编译时编译器也无法对此类未声明的异常进行检查,仅能通过在编写时尽量避免其异常的发生。故在编写时需要遵循以下原则进行编写,达到避免的目的:

  • 所有变量在声明后应当尽快指向对应引用对象,在未指向明确引用对象时不对该变量进行任何操作。
  • 在public方法定义时,所有入参应当进行必要的非空检查,如果为空抛出有含义的异常或指向明确的对象继续后续执行。private方法因为无法被其他类进行直接引用,是否需要检查可以根据实际情况来看。

异常发生后诊断

在Java1.4之后对于空指针异常会给出明确提示,如下:

in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list" is null

根据异常提示可以快速定位到具体的发生异常的调用栈信息定位到具体的源码行,再根据异常信息中提示的变量名就可以快速找到异常点。参照上个章节进行处理即可。

版权声明,本文首发于 数字魔盒 https://www.dm2box.com/ 欢迎转载。
阅读 603
1 声望
2 粉丝
0 条评论
你知道吗?

1 声望
2 粉丝
文章目录
宣传栏