[英]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
意味着a
是null
。 那为什么 a.staticMethod() 不抛出Null Pointer
?
因为staticMethod
是static
,所以编译器替换a.staticMethod();
用A.staticMethod();
引用 JLS( 第 15.12.4 节。方法调用的运行时评估):
如果表单是ExpressionName。 [TypeArguments] 标识符,然后:
如果调用方式为
static
,则没有目标引用。 ExpressionName被评估,但结果随后被丢弃。否则,目标引用是ExpressionName表示的值。
和:
如果调用方式是
static
,则不需要目标引用,并且不允许覆盖。 classT
的方法m
是要调用的方法。否则,将调用实例方法并且存在目标引用。 如果目标引用是
null
,此时会抛出NullPointerException
。
因此,当方法不是 static 并且“目标引用”是null
时,会引发NullPointerException
; 但是对于 static 方法,没有“目标引用”,也没有执行空值检查。
JLS 可以在这里指定一个空检查,但它没有,所以没有。 就我个人而言,我认为禁止像a.staticMethod()
这样的表达式更有意义,其中a
是一个变量而不是 class,但无论好坏,Java 语言设计者都选择允许这样做。
因为 static 方法属于类,所以它们不属于类的实例
由于 static 方法,所有 static 成员都在编译时解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.