首页>Program>source

在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
    }
}
最新回答
  • 2021-1-11
    1 #

    这可能有助于向您显示字节码.看看下面的 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上进行任何方法调用的尝试 导致了

    代码18显示您的 NullPointerException 对象作为参数传递给 null 方法.查看此方法的源代码将向您展示为什么not不会在NPE中产生结果:

    PrintStream.print()
    

    public void print(Object obj) { write(String.valueOf(obj)); } 将用 String.valueOf()做到这一点 s:

    null
    

    所以您可以看到那里有一个与 public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }相关的测试 ,并防止NPE。

  • 2021-1-11
    2 #

    null
    

    System.out.println(o.toString()) 正在尝试取消引用空对象以将其转换为字符串,然后再将其传递给 o.toString()

    println
    

    维兹威兹 被称为是 System.out.print(o1); 变体,它本身是在继续操作之前检查对象是否为null。

  • 2021-1-11
    3 #

    这是因为 print 使用 print(Object) 进行转换(除:转换后 print(Object) 会表现得像 String.valueOf(Object) 被称为 println(Object) 有效地使用 print(String) ). print(Object) 不像 write(int)那样扔NPE 并定义为返回 String.valueOf(Object) 为空参数。

    o.toString()

相关问题

  • angular:与Elvis-operator的双向绑定
  • objective c:在iPhone上查找已安装应用的列表