2015-08-28 3 views
6

एक जिज्ञासा जिसे मैंने अभी एक समस्या के बजाय देखा है।एक टर्नरी ऑपरेटर संकलन के परिणामस्वरूप नल लौटने (जहां एक बूलियन की उम्मीद है) क्यों?

मैं

public boolean x() { 
    return null; 
} 

या इस लिखने की अनुमति दी नहीं कर रहा हूँ:

public boolean x() { 
    if (DEBUG) { 
    return true; 
    } else { 
    return null; 
    } 
} 

लेकिन मैं लिखने के लिए

public boolean x() { 
    return DEBUG ? true : null; 
} 

ऐसा क्यों है की अनुमति दी है? (यह अगर "और" शाखा लिया जाता है एक एनपीई फेंकने के लिए प्रकट होता है।)

+0

धन्यवाद @ थिलो। स्पष्टीकरण के लिए: सवाल यह है कि, दो अन्य उदाहरणों के समान ही टर्नरी निर्माण क्यों खारिज नहीं किया जाता है? –

+1

@ माइकलके फिर से, सिर्फ जिज्ञासा से बाहर, क्या आपने 'सार्वजनिक बूलियन एक्स() { "(DEBUG) { वापस लौटने की कोशिश की है; } वापसी शून्य; } '? –

+0

संभावित डुप्लिकेट http://stackoverflow.com/questions/978324/java-ternary-immediate-if- मूल्यांकन? Java8 में – Jens

उत्तर

10

jls राज्यों के रूप में:

एक सशर्त अभिव्यक्ति के प्रकार के रूप में निम्न प्रकार निर्धारित किया जाता है: दूसरे और तीसरे ऑपरेंड एक ही प्रकार (जो अशक्त प्रकार हो सकता है) है, तो वह यह है कि सशर्त अभिव्यक्ति का प्रकार। यदि दूसरे और तीसरे ऑपरेशंस में से एक आदिम प्रकार टी का है, और दूसरा प्रकार मुक्केबाजी रूपांतरण (§5.1.7) को टी में लागू करने का परिणाम है, तो सशर्त अभिव्यक्ति का प्रकार टी

है

यह जावा null की अनुमति देता है इसका मतलब है, क्योंकि यह Boolean का एक उदाहरण है, जो boolean को अनबॉक्स्ड हो सकता है उत्पन्न (अधिक जानकारी के लिए jls में के बारे में boxing अनुभाग पढ़ें) के लिए इस्तेमाल किया जा सकता है। लेकिन चूंकि Boolean उदाहरण null प्रारंभ किया गया है, booleanValue() पर कॉल के परिणामस्वरूप NullPointerException होगा।

2

त्रिगुट ऑपरेटर देखता है आपके पास दो विकल्प true और null है, तो यह autoboxing का उपयोग करें और अपने आप में (यानी के परिणाम टाइप करने के लिए है सशर्त ऑपरेटर) Boolean (जो बदले में return द्वारा स्वचालित रूप से अनबॉक्स हो जाता है)।

सटीक नियम थोड़ा जटिल हैं, तो आप उन्हें in the JLS

रन-टाइम पर आप तो एक NullPointerException return मूल्य की unboxing दौरान मिल पा सकते हैं।

0

देखें JLS-15.25

एक सशर्त अभिव्यक्ति के प्रकार के रूप में निम्न प्रकार निर्धारित किया जाता है: ... दूसरे और तीसरे ऑपरेंड में से एक अशक्त प्रकार का है और अन्य प्रकार के लिए एक संदर्भ प्रकार होती है, तो सशर्त अभिव्यक्ति का प्रकार संदर्भ प्रकार है।

...

रन समय, सशर्त अभिव्यक्ति की पहली संकार्य अभिव्यक्ति पहले मूल्यांकन किया जाता है। यदि आवश्यक हो, तो परिणाम पर अनबॉक्सिंग रूपांतरण किया जाता है।

जिसके परिणामस्वरूप बूलियन मान तो या तो दूसरे या तीसरे संकार्य अभिव्यक्ति चुनने के लिए प्रयोग किया जाता है:

...

चयनित ऑपरेंड अभिव्यक्ति का मूल्यांकन किया जाता है और परिणामस्वरूप मूल्य ऊपर वर्णित नियमों के अनुसार सशर्त अभिव्यक्ति के प्रकार में परिवर्तित हो जाता है।

इस रूपांतरण में मुक्केबाजी (§5.1.7) या अनबॉक्सिंग (§5.1.8) रूपांतरण शामिल हो सकता है।

तो - अनिवार्य रूप से - अपने null एक Boolean में बॉक्सिंग कर रहा है।

+0

देखें लेकिन दूसरा संदर्भ प्रकार नहीं है। नियम लागू करने के लिए जेएलएस में पढ़ें जो यहां लागू होता है। – Thilo

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