Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么空引用打印为“空引用”;空";_Java_Nullpointerexception - Fatal编程技术网

Java 为什么空引用打印为“空引用”;空";

Java 为什么空引用打印为“空引用”;空";,java,nullpointerexception,Java,Nullpointerexception,在println中,这里o.toString()抛出NPE,但o1不抛出NPE。为什么? 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); /

在println中,这里o.toString()抛出NPE,但o1不抛出NPE。为什么?

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
    }
}
这是因为对转换的使用(旁白:转换后的行为就像被调用一样,
print(Object)
有效地使用了
write(int)
String.valueOf(Object)
不会像
o.toString()
那样抛出NPE,而是定义为为为null参数返回
“null”

System.out.println(o.toString())
o.toString()
在将空对象传递给
println
之前,试图取消对空对象的引用以将其转换为字符串

System.out.print(o1);

调用的
print
print(Object)
变量,它本身在继续之前检查对象是否为空。

它可能有助于显示字节码。请看一下您的类的以下
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

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

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

所以你可以看到这里有一个测试,它处理
null
,并防止出现NPE。

它是。不客气。我经常发现查看
javap
的输出可以相当有见地。特别是当使用AspectJ和其他代码编织技术时——只是为了确切地了解他们对我的代码做了什么!不需要看代码。这些都在文档中
PrintStream::println
表示它调用
String.valueOf
,它明确声明:“如果参数为null,则返回一个等于“null”的字符串;否则,返回obj.toString()的值。”
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}