2012-11-08 15 views
12

में मुझे हमेशा यही लगता है कि जावा में आदिम प्रकार null नहीं किया जा सकता, क्योंकि यह एक संकलन समय त्रुटि है अगर मैं कुछ इस तरह करने का प्रयास:कारण है कि मैं अशक्त करने के लिए आदिम प्रकार सेट कर सकते हैं त्रिगुट संचालन

int test = null; 

हालांकि

int test; 
if (something != 0){ 
    test = 5; 
} else { 
    test = null 
} 
:

int test = something != 0 ? 5 : null; 

एक त्रिगुट आपरेशन बस के लिए कम (इस मामले में) नहीं है: एक त्रिगुट ऑपरेशन में, यह अनुमति दी किया जा रहा है 10

जो निश्चित रूप से अनुमति नहीं दी जानी चाहिए। अगर वह स्थिति विफल हो जाती है, तो ऑटोबॉक्सिंग के कारण यह स्वचालित रूप से NullPointerException फेंक देगा। तो जावा-कंपाइलर इस तरह बकवास क्यों नहीं लाता है?

+1

वैसे, आप * आदिम * प्रकारों के बारे में बात कर रहे हैं। कच्चे प्रकार कुछ पूरी तरह से अलग हैं। http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html – Natix

+0

आप सही हैं! मैंने बस उन्हें भ्रमित कर दिया, और –

+0

के अनुसार इसे बदल दिया [जावा में ट्रिकी टर्नरी ऑपरेटर - ऑटोबॉक्सिंग] (http://stackoverflow.com/questions/8098953/tricky-ternary-operator-in-java-autoboxing) –

उत्तर

12

क्या होता है कि जावा कंपाइलर पहले : बराबर के दोनों तरफ अभिव्यक्ति के प्रकार बनाने की कोशिश करता है। इस मामले में, यह 5 को Integer पर ऑटोबॉक्स करता है; ध्यान दें कि nullInteger के लिए मान्य मान है। पूरे टर्नरी अभिव्यक्ति का परिणाम Integer है। आप इसे int पर असाइन करते हैं, इसलिए Integer तब ऑटोऑनबॉक्स किया जाता है।

अनिवार्य रूप से संकलक autoboxing और -unboxing लागू होता है तो यह है कि लाइन इस तरह लग रहा है:

int test = (something != 0 ? Integer.valueOf(5) : null).intValue(); 

दरअसल, autounboxing null एक NullPointerException की ओर जाता है।

तो जावा-कंपाइलर इस तरह बकवास क्यों नहीं लाता है?

क्योंकि जावा भाषा के डिजाइनरों को इस तरह से है कि यह इस तरह काम करता है और तय नहीं था कि यह एक त्रुटि के रूप में इलाज किया जाना है कि में भाषा में परिभाषित किया गया ...

जावा के Section 15.25 भाषा विशिष्टता बताती है कि संपूर्ण अभिव्यक्ति का प्रकार कैसे निर्धारित किया जाता है।

+0

@nhahtdh आप ऐसा क्यों सोचते हैं? – Jesper

+0

क्षमा करें, कभी भी ध्यान न दें। तुम सही हो। अलग-अलग कोड पढ़ने पर यह मेरे हिस्से पर भ्रम है। – nhahtdh

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