2010-10-28 11 views
8

संभावित डुप्लिकेट:जावा ऑटो मुक्केबाजी/unboxing wierdness

Integer test = null; 
Integer test2 = true ? test : 0; 
System.out.println(test2); 

सही ढंग से मुद्रित करने के लिए "शून्य:
Booleans, conditional operators and autoboxing
Java, Google Collections Library; problem with AbstractIterator?

नीचे कोड एक एनपीई पैदा करता है "अपवाद के बिना इस कोड की आवश्यकता है:

Integer test = null; 
Integer test2 = true ? test : (Integer)0; 
System.out.println(test2); 

यह पहला उदाहरण है कि "परीक्षण" को अनबॉक्स किया गया है (देशी int में परिवर्तित), लेकिन क्यों? और टर्नरी ऑपरेटर में दूसरी अभिव्यक्ति को क्यों बदलता है (जैसा कि दूसरे उदाहरण में) इसे ठीक करता है? क्या कोई भी इस तरह की कथा प्रदान कर सकता है कि वास्तव में कब, क्या, और क्यों दोनों उदाहरणों में सामान बॉक्सिंग और अनबॉक्स किए गए हैं?

+0

देखें http://www.mail-archive.com/[email protected]/msg32723.html – Adam

+0

या [जावा, Google संग्रह लाइब्रेरी; सार तत्व के साथ समस्या? ] (http://stackoverflow.com/questions/1821510/java-google-collections-library-problem-with-abstractiterator), जो विशेष रूप से 'int' के बारे में है। –

+0

फिर भी किसी ने भी जवाब नहीं दिया है (इस विशिष्ट उदाहरण के लिए) कब और क्या बॉक्सिंग और ऑटोबॉक्साइड हो जाता है। पहले में – GreenieMeanie

उत्तर

18
section 15.25 of the Java Language Specification से

:

एक सशर्त अभिव्यक्ति के प्रकार के रूप में निम्न प्रकार निर्धारित किया जाता है:

  • दूसरे और तीसरे ऑपरेंड एक ही प्रकार (जो अशक्त प्रकार हो सकता है) है, तो फिर वह सशर्त अभिव्यक्ति का प्रकार है।
    • यदि दूसरे और तीसरे ऑपरेटरों में से एक प्रकार बुलियन है और दूसरा प्रकार बूलियन प्रकार है, तो सशर्त अभिव्यक्ति का प्रकार बूलियन है।
    • यदि दूसरे और तीसरे ऑपरेटरों में से एक शून्य प्रकार का है और दूसरा प्रकार का संदर्भ प्रकार है, तो सशर्त अभिव्यक्ति का प्रकार संदर्भ प्रकार है।
    • अन्यथा, यदि दूसरे और तीसरे ऑपरेंड प्रकार है कि परिवर्तनीय हैं (§5.1.8) सांख्यिक प्रकार के लिए, तो वहाँ कई मामलों रहे हैं:
      • ऑपरेंड का एक प्रकार बाइट या बाइट और का है, तो दूसरा छोटा या छोटा प्रकार है, फिर सशर्त अभिव्यक्ति का प्रकार छोटा है।
      • यदि ऑपरेशंस में से कोई एक प्रकार टी है जहां टी बाइट, शॉर्ट, या चार है, और अन्य ऑपरेंड टाइप int की निरंतर अभिव्यक्ति है जिसका मूल्य टाइप टी में प्रतिनिधित्व योग्य है, तो सशर्त अभिव्यक्ति का प्रकार टी है
      • यदि ऑपरेटरों में से एक बाइट प्रकार का है और अन्य ऑपरेंड टाइप int की निरंतर अभिव्यक्ति है जिसका मूल्य टाइप बाइट में प्रदर्शित होता है, तो सशर्त अभिव्यक्ति का प्रकार बाइट है।
      • यदि ऑपरेशंस में से कोई एक प्रकार छोटा है और अन्य ऑपरेंड टाइप int की निरंतर अभिव्यक्ति है जिसका मान प्रकार में छोटा होता है, तो सशर्त अभिव्यक्ति का प्रकार छोटा होता है।
      • यदि ऑपरेंड में से कोई एक प्रकार का है; चरित्र और अन्य ऑपरेंड टाइप int की निरंतर अभिव्यक्ति है जिसका मूल्य टाइप चार में प्रतिनिधित्व योग्य है, फिर सशर्त अभिव्यक्ति का प्रकार चार है।
      • अन्यथा, बाइनरी न्यूमेरिक पदोन्नति (§5.6.2) ऑपरेंड प्रकारों पर लागू होती है, और सशर्त अभिव्यक्ति का प्रकार दूसरे और तीसरे ऑपरेटरों का प्रचारित प्रकार होता है। ध्यान दें कि बाइनरी न्यूमेरिक पदोन्नति अनबॉक्सिंग रूपांतरण (§5.1.8) और मान सेट रूपांतरण (§5.1.13) करता है।

तो यह अंतिम गोली अनुसरण कर रहा है, बाइनरी संख्यात्मक पदोन्नति, जो एक unboxing रूपांतरण करता प्रदर्शन। तो सशर्त ऑपरेटर अभिव्यक्ति का प्रकार int है, भले ही आप इसे Integer पर असाइन कर रहे हों। यह null पर अनबॉक्सिंग रूपांतरण करने की कोशिश कर रहा है, इसलिए अपवाद।

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