繁体   English   中英

为什么没有null会抛出指针异常

[英]Why no null pointer exception will be thrown

以下是代码片段:

class A {
  static void staticMethod() {
    System.out.println("Static Method");
  }
}


public class App {
  public static void main(String[] args) {
    A a = null;

    a.staticMethod();
  }
}

A a = null意味着anull 那为什么 a.staticMethod() 不抛出Null Pointer

因为staticMethodstatic ,所以编译器替换a.staticMethod(); A.staticMethod();

引用 JLS( 第 15.12.4 节方法调用的运行时评估):

如果表单是ExpressionName。 [TypeArguments] 标识符,然后:

如果调用方式为static ,则没有目标引用。 ExpressionName被评估,但结果随后被丢弃。

否则,目标引用是ExpressionName表示的值。

和:

如果调用方式是static ,则不需要目标引用,并且不允许覆盖。 class T的方法m是要调用的方法。

否则,将调用实例方法并且存在目标引用。 如果目标引用是null ,此时会抛出NullPointerException

因此,当方法不是 static 并且“目标引用”是null时,会引发NullPointerException 但是对于 static 方法,没有“目标引用”,也没有执行空值检查。

JLS 可以在这里指定一个空检查,但它没有,所以没有。 就我个人而言,我认为禁止像a.staticMethod()这样的表达式更有意义,其中a是一个变量而不是 class,但无论好坏,Java 语言设计者都选择允许这样做。

因为 static 方法属于类,所以它们不属于类的实例

由于 static 方法,所有 static 成员都在编译时解析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM