首頁>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
    }
}
最新回復
  • 6月前
    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。

  • 6月前
    2 #

    null
    

    System.out.println(o.toString()) 正在尝試取消引用空物件以將其轉換為字元串,然後再將其傳遞给 o.toString()

    println
    

    維兹威兹 被稱為是 System.out.print(o1); 變體,它本身是在繼續操作之前檢查物件是否為null。

  • 6月前
    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上查詢已安裝應用的列表