NullPointerException原因及解决办法

时间:2021-09-09 13:55:04

为什么会产生空指针异常,我们先来看一下JDK1.6的API

NullPointerException (Java Platform SE 6)
public class NullPointerException extends RuntimeExceptionnull

   当应用程序试图在需要对象的地方使用时,抛出该异常。这种情况包括:

    * 调用 null 对象的实例方法。
    * 访问或修改 null 对象的字段。
    * 将 null 作为一个数组,获得其长度。
    * 将 null 作为一个数组,访问或修改其时间片。
    * 将 null 作为 Throwable 值抛出。

应用程序应该抛出该类的实例,指示其他对 null 对象的非法使用。



由以上说明可以看出,最主要的原因就是调用的对象是NULL

经常会出现空指针的情况有


   (1)字符比较
    String str1 = someclass.getSomeString();
    if(str1.equalsIgnoreCase("YES"))
    {
      //do something
    }
    else if(str1.equalsIgnoreCase("NO"))
    {
     //do something else
    }
    (2)读取配置文件
       props.getProperty("somekey");
    (3)从MAP取值
        map.get("key");
    (4)从Session取值
        String userName = request.getSession().getAttribute("userName");

    等等,这里发生NullPointerException的机会非常大,而且运行情况往往和用户输入的数据有关,所以不容易被发现.
      如何避免空指针异常?最主要的是养成一个好的编码习惯,在对对象进行调用方法、比较等等操作时,要判断一下对象有没有可能会是NULL,提前进行处理。
      尤其要注意的是字符比较的时候:为避免出现NullPointerException,不要这么写:str1.equalsIgnoreCase("YES");而应该写成这样:"YES".equalsIgnoreCase(str1),这样就可以避免空指针异常。
    至于这两种写法的差异,主要是程序对对象的操作是先判断再执行,就是先判断对象是否存在,然后再去执行其它操作。第一种方式在判断str1的时候,如果str1是null,这是程序肯定会抛出异常,而第二种就OK,不会报异常。