java - NULL 上的方法调用工作正常 - 期待 NPE

标签 java nullpointerexception

我能够在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/

相关文章:

java - NullPointerException - edittext.gettext()

java - "AWT-EventQueue-0"游戏试用代码错误

java - Android getIntent() 空指针异常

java - 为伪装的 URL 地址抛出新的异常

java - Spring、Hibernate 和 Ehcache - 错误的实体

java - 线程 "main"java.util.InputMismatchException : using scanner 中出现异常

java - 测试应用程序时出现 NullPointerException

java - Android:如何使用定时器

java - 如何创建单个 jar 以包含来自不同文件夹的多个 java 文件

java - C++ JNI UnsatisfiedLinkError