使用静态作为对象时是否为空指针?

时间:2013-07-20 07:14:37

标签: java exception object pointers static

import java.io.*;
import java.lang.*;

class sample
{  
public void print_func() 
{
System.out.println("This is fromprint_fun");
} 
}

class test
{
public final static sample s = null; 
}

public class hello
{
public static void main(String args[])
{
test.s.print_func();
System.out.println("Hello World");
}
}

线程“main”java.lang.NullPointerException中的异常 在hello.main(hello.java:22)

有人能告诉我究竟是什么问题吗?

1 个答案:

答案 0 :(得分:4)

是 - s为空。您永远不会将其初始化为非空引用,因此当您尝试通过调用s.print_func取消引用它时,会抛出异常。

这与变量静态无关。如果你这样做,你会得到完全相同的异常:

public static void main(String args[])
{
    sample s = null;
    s.print_func();
}

编辑:要更全面地解决您的评论,请查看以下内容:

class test
{
    public final static sample s = null; 
}

这声明了一个类,并在其中声明了一个变量。那是不是一个对象。区分三个概念很重要:

  • 变量,是指定的存储位置。变量有一个值,在这种情况下,它是一个值,它是一个引用
  • 引用,始终为null或获取兼容类型对象的方式
  • 一个对象

所以如果你有:

public static final sample s = new sample();

然后s仍然是变量;它的值将是一个非空引用,它引用类型为sample的对象。

s视为一张纸,可以是空白的(null参考)  或包含房屋的街道地址。地址本身不是房子 - 它只是获得到房子的一种方式。可以有几张纸,上面写有相同的地址。将地址复制到另一张纸上并不能创建一个新房子。

希望这有帮助。