它可能有助於向您顯示字節碼。看看你的類的以下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()
。這裏o
是null
所以任何在null
上調用方法的嘗試都會導致NullPointerException
。
代碼18顯示您的null
對象作爲參數傳遞給PrintStream.print()
方法。綜觀此方法的源代碼,會告訴你爲什麼這樣做不結果在NPE:
public void print(Object obj) {
write(String.valueOf(obj));
}
和String.valueOf()
將做到這一點與null
S:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
所以,你可以看到有是一個測試那裏處理null
,並防止NPE。
這是[全部在文檔中](http://download.oracle.com/javase/6/docs/api/java/io/PrintStream.html#print%28java.lang.Object%29)。 – 2011-09-10 20:28:52