当声明一个引用变量(即一个对象)时,实际上是在创建一个指向对象的指针。
下面的代码,其中声明原始类型的变量int:
int x;
x = 10;
在这个例子中,变量x是一个int , Java将初始化为0。当给他分配值 10 时,10被写入到被引用的内存位置X.
但是,当试图声明引用类型时,就会报错。如下面的代码:
Integer num;
num = new Integer(10);
第一行声明一个变量名num,由于是引用类型,所以系统给他默认复制为 null;
在第二行中,new关键字用于实例化对象。指针将变量num分配给第一行Integer目标,这时就会报空指针。
这个NullPointerException异常是,当声明变量但未创建对象时发生。所以指针指向的是一些实际上并不存在的东西。
如果试图取消引用num在创建对象之前,会报NullPointerException。在通常情况下,编译器会发现问题并让你知道。num may not have been initialized(num没有初始化)
“但是有时可以写不直接创建对象的代码。
例如,可以有如下方法:
public void doSomething(SomeObject obj) {
//do something to obj
}
在这种情况下,不用再创建对象obj,而是假设它是在调用doSomething()方法之前创建的。注意,有可能调用这样的方法:
doSomething(null);
在这种情况下,obj是null。如果该方法意在对传入的对象做一些事情,则适当地抛出NullPointerException因为它是提示给程序员的错误,程序员需要这些信息来调试。
或者,可能存在这样的情况,该方法的目的不仅仅是对传入的对象进行操作,因此(空参数)可以是可接受的。在这种情况下,需要判断参数是否是null,并给出其他实现条件else。应该在文档中解释这一点。例如,doSomething()可以写成:
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}