为什么我没有收到 NullPointerException?

2022-09-03 06:14:57

可能的重复项:
Java 中空引用上的静态字段

我知道静态方法是在类级别上。因此,我知道我不需要创建实例来调用静态方法。但我也知道我可以像实例方法一样调用静态方法。这是我感到困惑的地方,因为我期望从空对象调用静态方法(如调用实例方法)。我真的很感激一些解释为什么我错误地期望在这里。NullPointerExceptionNullPointerException

下面是示例代码:

public class SampleClass {

    public static int getSumStatic(int x, int y){
        return x+y;
    }

    public int getDifferenceInstance(int x, int y){
        return x-y;
    }
}

public class TestClass {

    public static void main (String[] args){        
    SampleClass sc=null;

    System.out.println(SampleClass.getSumStatic(2, 2)); //as expected

    //I was expecting NullPointerException in the next line, since I am accessing null object
    System.out.println(sc.getSumStatic(4,5)); //static method , executes perfectly  

    System.out.println(sc.getDifferenceInstance(6,4));//throws NullPointerException
    }
}

答案 1

通过实例调用静态方法不需要实例存在。只要编译器能够确定变量的类型,它就会在计算表达式并丢弃结果后静态地进行等效调用:sc

System.out.println(SampleClass.getSumStatic(4,5));

来自 Java 语言规范

部分 15.12.1

❖ 如果形式是 ,则方法的名称是标识符。设 T 为主表达式的类型。如果 T 是类或接口类型,则要搜索的类或接口为 T;如果 T 是类型变量,则为 T 的上限。Primary.NonWildTypeArgumentsopt Identifier

第 15.12.4.1 节:

  1. 如果涉及方法调用的第二个生产(包括主数据库),则有两个子案例:

❖ 如果调用模式是静态的,则没有目标引用。计算表达式 Primary,但随后丢弃结果。


答案 2

这是Java设计师的某种设计错误。您应该对类调用静态方法因为它属于该类而不是对象。

你可以在 why-not-call-a-static-method-by-way-of-an-instance-an-error-for-the-java-co 中看到一些关于这个问题的信息。

有趣的是,不可能在尚未初始化的对象变量上调用静态方法。但是,如果对象初始化为 null,则一切都很好。

我认为这有效,因为与此变量一起存储的对象通过赋值提供类型信息

SampleClass sampleObject;
sampleObject.getSumStatic(2, 2) 

不会编译,因为对象未初始化,因此在 java 编译器的语法树中没有设置类型信息


推荐