在 println 中,这里 o.toString() 抛出 NPE,但 o1 不会。为什么?
public class RefTest {
public static void main(String[] args) {
Object o = null;
Object o1 = null;
System.out.println(o.toString()); //throws NPE
System.out.print(o1); // does not throw NPE
}
}
它可能有助于向您展示字节码。看看下面的内容javap
你的班级的输出:
> javap -classpath target\test-classes -c RefTest
Compiled from "RefTest.java"
public class RefTest extends java.lang.Object{
public RefTest();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: astore_1
2: aconst_null
3: astore_2
4: getstatic #17; //Field java/lang/System.out:Ljava/io/PrintStream;
7: aload_1
8: invokevirtual #23; //Method java/lang/Object.toString:()Ljava/lang/String;
11: invokevirtual #27; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: getstatic #17; //Field java/lang/System.out:Ljava/io/PrintStream;
17: aload_2
18: invokevirtual #33; //Method java/io/PrintStream.print:(Ljava/lang/Object;)V
21: return
}
只需查看 main 方法,您就可以看到感兴趣的行在哪里Code
是 8 和 33。
代码 8 显示您调用的字节码o.toString()
. Here o
is null
因此任何对方法调用的尝试null
结果是NullPointerException
.
代码 18 显示您的null
对象作为参数传递给PrintStream.print()
方法。查看此方法的源代码将告诉您为什么这样做notNPE 的结果:
public void print(Object obj) {
write(String.valueOf(obj));
}
and String.valueOf()
将执行此操作null
s:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
所以你可以看到那里有一个测试涉及null
,并防止 NPE。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)