gpt4 book ai didi

java - 为什么空引用打印为 "null"

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:39 24 4
gpt4 key购买 nike

在 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

}

只看主要方法,您可以看到感兴趣的行是 Code 是 8 和 33 的地方。

代码 8 显示了您调用 o.toString() 的字节码。这里的 onull,因此对 null 的方法调用的任何尝试都会导致 NullPointerException

代码 18 显示您的 null 对象作为参数传递给 PrintStream.print() 方法。查看此方法的源代码将向您展示为什么这不会导致 NPE:

public void print(Object obj) {
write(String.valueOf(obj));
}

String.valueOf() 将使用 null 执行此操作:

public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

因此您可以看到那里有一个处理 null 并防止 NPE 的测试。

关于java - 为什么空引用打印为 "null",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7374363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com