2012-04-17 14 views
5

निम्न स्निपेट सरल जावा कोड का उपयोग करता है।जावा में अज्ञात NullPointerException

package pkg; 

final public class Main 
{ 
    final private class Demo 
    { 
     private Integer value = null; 

     public Integer getValue() 
     { 
      return value; 
     } 
    } 

    private Integer operations() 
    { 
     Demo demo = new Demo(); 
     return demo==null?new Integer(1):demo.getValue(); 
    } 

    public static void main(String[] args) 
    { 
     Main main=new Main(); 
     System.out.println("Value = " + String.valueOf(main.operations())); 
    } 
} 

उपरोक्त कोड में कोई समस्या नहीं के साथ की उम्मीद के रूप में काम करता है और कंसोल पर Value = null प्रदर्शित करता है।

निम्नलिखित return बयान में

return demo==null?new Integer(1):demo.getValue(); 

वस्तु के बाद प्रकार Demo की demoनहींnull, : के बाद अभिव्यक्ति जो है demo.getValue() निष्पादित किया जाता है जो आंतरिक Demo वर्ग जो null रिटर्न भीतर getValue() का आह्वान है और अंत में, इसे स्ट्रिंग में परिवर्तित किया जाता है और कंसोल पर प्रदर्शित किया जाता है।

लेकिन जब मैं नीचे दिखाए गए जैसा operations() विधि कुछ,

private Integer operations() 
{ 
    Demo demo = new Demo();  
    return demo==null?1:demo.getValue(); 
} 

फेंक देता है NullPointerException संशोधित करते हैं। कैसे?


मेरा मतलब है जब मैं इस return बयान

return demo==null?new Integer(1):demo.getValue(); 

यह काम करता है का उपयोग

(NullPointerException फेंक नहीं है) और जब मैं निम्नलिखित कुछ इसी तरहreturn कथन का उपयोग

return demo==null?1:demo.getValue(); 

यह NullPointerException का कारण बनता है। क्यूं कर?

+3

http://stackoverflow.com/questions/7811608/java-npe-in-ternary-operator-with-autoboxing [autoboxing साथ अजीब जावा NullPointerException] (की –

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/ 3265948/अजीब-जावा-NullPointerException-साथ-autoboxing) – Pops

उत्तर

11

यह बयान:

return demo==null?1:demo.getValue(); 

वास्तव में कुछ इस तरह में बदल दिया जा रहा है:

int tmp = demo == null ? 1 : demo.getValue().intValue(); 
return (Integer) tmp; 

सशर्त अभिव्यक्ति के प्रकार निर्धारित किया जाता है int (नहीं Integer) नियम laid out in the JLS, section 15.25 के आधार पर होना करने के लिए , binary numeric promotion (5.6.2) का उपयोग कर। शून्य संदर्भ से int पर रूपांतरण NullPointerException को ट्रिगर करता है।

3
return demo==null?new Integer(1):demo.getValue(); 

इस मामले में अभिव्यक्ति का प्रकार पूर्णांक है, और शून्य एक कानूनी मान है।

return demo==null?1:demo.getValue(); 

इस मामले में अभिव्यक्ति की प्रकार int है, तो आपके पूर्णांक वापसी मान स्वचालित रूप से अनबॉक्स्ड है। और जैसा कि यह शून्य है, यह एक एनपीई फेंकता है।

संबंधित मुद्दे