ऑटो-अनबॉक्सिंग टर्नरी की जरूरत अगर-और


23

यह कोड ठीक काम करता है: -

    Integer nullInt = null;
    if (1 <= 3) {
        Integer secondNull = nullInt;
    } else {
        Integer secondNull = -1;
    }
    System.out.println("done");

लेकिन यह शून्य-सूचक अपवाद को फेंकता है, जबकि ग्रहण ने चेतावनी दी है कि ऑटो-अनबॉक्सिंग की आवश्यकता है: -

    Integer nullInt = null;
    Integer secondNull = 1 <= 3 ? nullInt : -1;
    System.out.println("done");

ऐसा क्यों है, क्या कोई कृपया मार्गदर्शन कर सकता है?

जवाबों:


22

तिर्यक सशर्त अभिव्यक्ति का प्रकार

1 <= 3 ? nullInt : -1

है int(JLS कई तालिकाओं कि 2 और 3 ऑपरेंड के प्रकार के आधार पर त्रिगुट सशर्त ऑपरेटर के प्रकार का वर्णन शामिल हैं)।

इसलिए, जब यह nullIntएक को अनबॉक्स करने की कोशिश करता है int, तो एक NullPointerExceptionफेंक दिया जाता है।

अपने-और-स्निपेट के व्यवहार को प्राप्त करने के लिए, आपको लिखने की आवश्यकता है:

1 <= 3 ? nullInt : Integer.valueOf(-1)

अब अभिव्यक्ति का प्रकार होगा Integer, इसलिए कोई अनबॉक्सिंग नहीं होगा।


4
बस अपने उत्तर में जोड़ने के लिए, यहाँ उल्लिखित सारणियाँ हैं: docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25
ऐरलन

3

मुझे पूरा यकीन है कि टर्नरी ऑपरेटर के तर्क इसी प्रकार के होने चाहिए। चूंकि आप -1 का उपयोग कर रहे हैं और कुछ निरंतर nullintसंकलक nullintमान प्राप्त करने के लिए अनबॉक्स करने की कोशिश करते हैं । और फिर इसे secondNullचर में संग्रहीत करने के लिए ऑटोबॉक्स ।


3

ऐसा इसलिए है क्योंकि जब सशर्त ऑपरेटर के लिए दो ऑपरेंड ? :एक आदिम प्रकार और उसके बॉक्सिंग संदर्भ प्रकार होते हैं, तो एक अनबॉक्सिंग रूपांतरण किया जाता है ( JLS §15.25.2 ):

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

  • ...
  • यदि दूसरे और तीसरे संचालकों में से एक आदिम प्रकार टी का है, और दूसरे का प्रकार टी में बॉक्सिंग रूपांतरण (conversion5.1.7) को लागू करने का परिणाम है, तो सशर्त अभिव्यक्ति का प्रकार टी है।

सामान्य तौर पर, एक ifकथन को ? :अभिव्यक्ति के साथ बदलना हमेशा कोड के अर्थ को संरक्षित नहीं करता है, क्योंकि ? :अभिव्यक्ति को स्वयं एक संकलन-समय प्रकार की आवश्यकता होती है। इसका मतलब है कि जब दो ऑपरेंड के प्रकार अलग-अलग होते हैं, तो एक या दोनों में रूपांतरण किया जाना चाहिए ताकि परिणाम में एक सुसंगत संकलन-समय प्रकार हो।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.