我能够在null
上调用greet方法,这里我期待NPE
,因为我们无法从语言中调用null
上的方法规范JLS-15.12
。
但是我在这里得到hello world
public class Test{
public static void greet() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
((Test) null).greet();
}
}
有人可以帮助我为什么我得到的是 hello world
而不是 NPE
最佳答案
编译器将您的调用替换为静态调用。
如果您使用javap -v className
检查字节码,您将看到它。
stack=0, locals=1, args_size=1
0: invokestatic #31 // Method greet:()V
3: return
编译器知道您不必要地使用复杂的方式来调用您的方法,并将其简化为基本的静态调用。静态方法应该在静态上下文中调用,而不是在实例上下文中调用,任何好的 IDE 都会要求您更改现有代码。
即使您执行new Sample().greet();
,编译器也会执行相同的优化。
关于java - NULL 上的方法调用工作正常 - 期待 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43864502/