java - जावा में स्ट्रिंग्स और इंटेगर के अशक्त मूल्य




string nullpointerexception (4)

public class Test {
    public static void main(String[] args) {

        String s = null;
        String s1 = null;
        Integer i = null;
        Integer i1 = null;

        System.out.println(s+i);
        System.out.println(i+s);
        System.out.println(s+s1);

        try {
            System.out.println(i+i1);
        } catch (NullPointerException np) {         
            System.out.print("NullPointerException");       
        }
    }

}

प्रश्न सरल है - मुझे केवल अंतिम पंक्ति में NullPointerException क्यों मिलती है?


आप कार्यक्रम के लिए bytecode पर एक नज़र है। आप देखेंगे कि आपका नल ऑब्जेक्ट PrintStream.print () पद्धति के पैरामीटर के रूप में पारित किया जा रहा है। प्रिंट के लिए स्रोत कोड () विधि String.valueOf () का उपयोग करता है जैसा कि नीचे दिखाया गया है:

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

आपका कोड दो अलग-अलग एडिटिव ऑपरेटरों का उपयोग करता है। पहली तीन पंक्तियाँ स्ट्रिंग संघनन का उपयोग करती हैं, जबकि अंतिम एक संख्यात्मक अंक का उपयोग करता है।

स्ट्रिंग संघनन को null "null" में बदलने के लिए अच्छी तरह से परिभाषित किया गया है :

  • यदि संदर्भ null , तो इसे स्ट्रिंग "null" (चार ASCII वर्ण n , u , l , l ) में बदल दिया जाता है।

इसलिए कोई एनपीई नहीं है।

दो Integer ऑब्जेक्ट्स को एक साथ जोड़ने से उन्हें unboxed करने की आवश्यकता होती है। इसके परिणामस्वरूप null संदर्भ को निष्क्रिय कर दिया जाता है, जो NPE की ओर जाता है:

  • यदि r शून्य है, तो अनबॉक्सिंग रूपांतरण NullPointerException फेंकता है

ऑटो-अनबॉक्सिंग का मामला लगता है। यदि आपको first और second दो first.intValue() + second.intValue() , तो उनके जोड़ का परिणाम first होगा first.intValue() + second.intValue() । चूँकि दोनों ही अशक्त हैं, जिसके परिणामस्वरूप एक NPE है।


ध्यान दें कि पहले तीन + संचालक usages में स्ट्रिंग समाकलन शामिल है। केवल अंतिम एक वास्तविक संख्यात्मक योग है । जब स्ट्रिंग संयोजन शामिल होता है (जहां चर शामिल होता है), जावा कंपाइलर प्रदर्शन को बेहतर बनाने के लिए कुछ चतुर चाल का उपयोग करता है। यह StringBuilder साथ + ऑपरेटर को प्रतिस्थापित करता है। उदाहरण के लिए आपकी पहली पंक्ति का अनुवाद इस प्रकार है:

StringBuilder tmp = new StringBuilder();
tmp.append(s);
tmp.append(i);
System.out.println(tmp);

StringBuilder null तो कोई बात नहीं क्या आप एक तर्क के रूप में गुजरती हैं, यह अच्छी तरह से "null" स्ट्रिंग के साथ बदल देता है।

अंतिम पंक्ति में स्थिति अलग है। वहाँ आप दो Integer वस्तुओं का संदर्भ देते हैं। जेवीएम यहां केवल उन्हें ( i.intValue() करने और वास्तविक संगणना करने के लिए कर सकता है। null का NullPointerException कारण बनता है।





autoboxing