什么是NullPointerException

Python/Java学习交流群:369606713


什么是NullPointerException

声明引用变量(即对象)时,实际上是在创建指向对象的指针。请考虑以下代码,您可以在其中声明基本类型的变量int

int x;
x = 10;

在此示例中,变量x是a int,Java将为您初始化为0。当您在第二行中将其分配给10时,您的值10将被写入x指向的内存位置。

但是,当您尝试声明引用类型时会发生不同的事情。请使用以下代码:

Integer num;
num = new Integer(10);

第一行声明了一个名为的变量num,但它不包含原始值。相反,它包含一个指针(因为类型Integer是一个引用类型)。既然你还没有说什么指向Java,它将它设置为null,意思是“ 我指着什么都没有 ”。

在第二行中,new关键字用于实例化(或创建)Integer类型的对象,并为指针变量num分配此对象。您现在可以使用解除引用运算符.(点)来引用对象。

Exception当你声明一个变量,但没有创建一个对象,你问发生。如果您num在创建对象之前尝试取消引用,则会得到一个NullPointerException。在最琐碎的情况下,编译器将捕获问题并让您知道“num可能尚未初始化”,但有时您编写的代码不会直接创建对象。

例如,您可能有如下方法:

public void doSomething(SomeObject obj) {
   //do something to obj
}

在这种情况下,您不是在创建对象obj,而是假设它是在doSomething调用方法之前创建的。不幸的是,可以像这样调用方法:

doSomething(null);

在这种情况下objnull。如果该方法旨在对传入的对象执行某些操作,则抛出该方法是合适的,NullPointerException因为它是程序员错误,程序员将需要该信息用于调试目的。

或者,可能存在这样的情况:该方法的目的不仅仅是对传入的对象进行操作,因此可以接受空参数。在这种情况下,您需要检查null参数并采取不同的行为。您还应该在文档中解释这一点。例如,doSomething可以写成:

/**
  * @param obj An optional foo for ____. May be null, in which case
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}