为什么在null引用上调用(静态)方法不会抛出NullPointerException?

时间:2010-07-20 19:00:52

标签: java static null nullpointerexception

我用Java编写了这个程序

public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test();
  }

}

我读到在null对象上调用方法会导致NullPointerException,但上述程序却没有?为什么是这样?我不正确地理解某事吗?

5 个答案:

答案 0 :(得分:78)

test()是一种static方法。 static成员属于该类型,不需要实例访问。

static成员应通过类型表达式访问。也就是说,您应该按如下方式编写它:

Why.test(); // always invoke static method on the type it belongs to!

Java允许您通过对象引用表达式访问static成员,但是 这是非常误导,因为这是 NOT static成员访问的实际语义。

Why aNull = null; 
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException

通过对象引用表达式访问static成员时,只有声明的引用类型才对。这意味着:

  • 引用实际上是null并不重要,因为不需要实例
  • 如果引用不是null,那么对象的运行时类型是什么并不重要,没有动态调度 !!!

正如您所看到的,对于实例成员访问,两个点上的确切对立都是正确的。这就是为什么static成员应该以“非static”方式访问从不的原因,因为它会对其实际行为产生非常误导性的外观。

相关问题

答案 1 :(得分:3)

静态方法不需要对对象的引用。所以你可以调用它甚至引用该对象为null。这就是主要方法的工作原理。

尝试从对象中删除静态指定以查看空指针异常。

答案 2 :(得分:3)

这是一个静态方法,它允许您在不实例化实例的情况下调用方法。

答案 3 :(得分:3)

您应该在IDE中打开各种警告。您可能会看到有关以非静态方式访问静态成员的警告。

您可以执行类似(Why)(null).test()的操作,它只使用(Why)(null)来获取类。

答案 4 :(得分:1)

静态变量&方法与类相关联,而不是与任何对象相关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。

任何对象都可以更改类变量的值,但是也可以在不创建类的实例的情况下操作类变量,同样适用于静态方法。 更多refer this