0
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");
}
}

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

任何人都可以让我知道实际上是什么问题吗?

4

1 回答 1

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参考),也可以包含房屋的街道地址。地址本身不是房子——它只是到达房子的一种方式。可以有几张纸,上面都写着相同的地址。将地址复制到另一张纸上不会创建新房子。

希望这会有所帮助。

于 2013-07-20T07:16:19.767 回答