问题

什么是Null指针异常( java.lang.NullPointerException ),是什么原因?

什么方法/工具可用于确定原因,以便停止异常导致程序过早终止?



解决方法

当你声明一个引用变量(即一个对象),你真的创建一个指向一个对象的指针.考虑下面的代码,其中你声明一个基本类型 int 的变量:

int x;
x = 10;

在这个例子中,变量x是一个 int ,Java会将它初始化为0.当您在第二行中将它分配给10时,您的值10将写入x指向的存储器位置.

但是,当你试图声明一个引用类型发生不同的事情.请使用以下代码:

Integer num;
num = new Integer(10);

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

在第二行中, new 关键字用于实例化(或创建)一个类型为Integer的对象,并且指针变量num被分配给该对象.现在可以使用取消引用运算符引用对象.(点).

您询问的异常发生在您声明变量但未创建对象时.如果你尝试在创建对象之前取消引用 num ,你会得到一个 NullPointerException .在最简单的情况下,编译器会捕获问题,让你知道"num可能没有被初始化",但有时你写的代码不直接创建对象.

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

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

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

doSomething(null);

在这种情况下 obj 为null.如果方法打算对传入的对象执行某些操作,则应该抛出 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
    }
}

最后,如何确定异常位置&因为使用堆栈跟踪




相关问题推荐