发布日期:2018-03-26
空指针异常是什么?如何处理?+ 查看更多
空指针异常是什么?如何处理?
+ 查看更多
发布日期:2018-02-23 17:30
分类:JAVA
浏览次数:257
如下:
空指针异常是什么(java.lang.NullPointerException),是什么造成了空指针异常?
有什么方法可以找出原因在哪里并且最终停止这个异常?
有什么方法可以找出原因在哪里并且最终停止这个异常?
回答:
当你声明一个引用变量(i,e等对象),你就创造了一个指向对象的指针。当你声明一个基本类型的变量,看一下下面的代码:
int x; x = 10;
第一行声明了一个名字为”name”的变量,但是它没有一个初始的值。而是拥有一个指针(
因为它的类型是Integer型,这是一个引用类型)。因为你没说它指向什么,意味着”什么都没有指向”。
在第二行,”new”关键字将实例化一个Integer类型的对象,并且指针变量”num”将会指向这个对象。你可以通过”.”操作符引用这个对象。
当你声明一个变量但是并没有创建一个对象初始化它的时候你询问的这个Exception就产生了。如果你想在创建对象之前引用”num”就会得到一个空指针异常。在大多数情况下编译期将会捕捉这个问题并且让你知道”可能是num没有被初始化”,但是有时候写代码时并不会直接创建一个对象。
举个例子,可能像下面这样:
因为它的类型是Integer型,这是一个引用类型)。因为你没说它指向什么,意味着”什么都没有指向”。
在第二行,”new”关键字将实例化一个Integer类型的对象,并且指针变量”num”将会指向这个对象。你可以通过”.”操作符引用这个对象。
当你声明一个变量但是并没有创建一个对象初始化它的时候你询问的这个Exception就产生了。如果你想在创建对象之前引用”num”就会得到一个空指针异常。在大多数情况下编译期将会捕捉这个问题并且让你知道”可能是num没有被初始化”,但是有时候写代码时并不会直接创建一个对象。
举个例子,可能像下面这样:
public void doSomething(SomeObject obj){ //do something to obj}
在这种情况下没有创建对象”obj”,而是假设在doSomething()被调用钱它已将被创建了。但是可能会象下面这样调用方法:
doSomething(null);
“obj”是空值。如果这个方法尝试做与这个被传入的变量相关的事情,将会引起空指针异常,因为这是一个用户错误而且用户需要调试这些信息。
另外,除了操作被传入的对象之外有其他的原因造成这个异常,因此一个空的参数是可以接受的。在这种情况下,你需要检查参数是否为空,然后做不同的操作。在文档里你也要做相关的解释。
下面,doSomething()方法可以像下面这样写:
doSomething(null);
“obj”是空值。如果这个方法尝试做与这个被传入的变量相关的事情,将会引起空指针异常,因为这是一个用户错误而且用户需要调试这些信息。
另外,除了操作被传入的对象之外有其他的原因造成这个异常,因此一个空的参数是可以接受的。在这种情况下,你需要检查参数是否为空,然后做不同的操作。在文档里你也要做相关的解释。
下面,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 }}
最后,请参考How to pinpoint the exception location & cause using Stack Trace