为什么我没有得到NullPointerException?

Jim*_*mmy 16 java nullpointerexception

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

我知道静态方法是在类级别上.所以我知道我不需要创建实例来调用静态方法.但我也知道我可以调用静态方法LIKE一个实例方法.这是我感到困惑的地方,因为我期待NullPointerException从null对象调用静态方法(如在调用实例方法中).我真的很感激为什么我错在NullPointerException这里期待一些解释.

以下是示例代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 14

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

System.out.println(SampleClass.getSumStatic(4,5));
Run Code Online (Sandbox Code Playgroud)

Java语言规范:

第15.12.1节

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

第15.12.4.1节:

  1. 如果涉及包含主节点的MethodInvocation的第二个制作,则有两个子句:

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

  • 说编译器只需要确定类型是不正确的.表达式需要进行评估.在更复杂的示例中,该表达式可能会导致NPE或导致其他异常. (4认同)