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)
非正式地说,你可以想到这一点
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)
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 次 |
最近记录: |