为什么在使用null引用访问静态时不会出现NullPointerException?

eat*_*ode 6 java static nullpointerexception

在下面的代码中,我们获得i了null引用的值,尽管a NPE不存在.

public class Test {
    static int i = 10;

    Test getTest() {
        return null;    
    }

    public static void main(String args[]) {
        Test t = new Test();
        System.out.println(t.getTest());  
        System.out.println(t.getTest().i);
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

null
10
Run Code Online (Sandbox Code Playgroud)

pet*_*rov 7

非正式地说,你可以想到这一点

System.out.println(t.getTest().i);
Run Code Online (Sandbox Code Playgroud)

相当于

System.out.println(Test.i);
Run Code Online (Sandbox Code Playgroud)

因为i是静态的.

这可能是最简单的答案.

严格来说,它们并不等同.实际上
getTest()被调用,但它的返回值不用于
访问该i字段,如下面的测试所示.

public class Test {
    static int i = 10;

    Test getTest() {
        System.out.println("Method getTest() called!");
        return null;    
    }

    public static void main(String args[]) {
        Test t = new Test();
        System.out.println(t.getTest());  
        System.out.println(t.getTest().i);
    }
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*eek 2

来自Java 语言规范

Receiver Variable Is Irrelevant For static Field Access

以下程序演示了可以使用空引用来访问类(静态)变量而不会导致异常:

class Test3 {
    static String mountain = "Chocorua";
    static Test3 favorite(){
        System.out.print("Mount ");
        return null;
    }
    public static void main(String[] args) {
        System.out.println(favorite().mountain);
    }
}
Run Code Online (Sandbox Code Playgroud)

它编译、执行并打印:

Mount Chocorua
Run Code Online (Sandbox Code Playgroud)

即使 favorite() 的结果为 null,也不会抛出 NullPointerException。打印“Mount”表明 Primary 表达式确实在运行时完全求值,尽管事实上仅使用其类型而不是其值来确定要访问的字段(因为字段 mountain 是静态的)。

意味着即使主表达式(这里是实例)在运行时被评估,但它的值被丢弃并且只考虑它的类型。


归档时间:

查看次数:

286 次

最近记录:

11 年,7 月 前