यह आपको बाइटकोड दिखाने में मदद कर सकता है। अपने वर्ग के निम्नलिखित 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 ऑब्जेक्ट को PrintStream.print()
विधि के पैरामीटर के रूप में पारित किया गया दिखाता है। इस विधि के लिए स्रोत कोड को देखते हुए आपको बताएंगे कि क्यों इस एनपीई में नहीं परिणाम करता है:
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
से संबंधित है, और एक एनपीई को रोकता है।
स्रोत
2011-09-10 20:23:27
यह [सभी दस्तावेज में] (http://download.oracle.com/javase/6/docs/api/java/io/PrintStream.html#print%28java.lang.Object%29) है। –