मैंने टर्नरी ऑपरेटर में एक अप्रत्याशित प्रकार-कास्ट के कारण दूसरे दिन वास्तव में अजीब NullPointerException
पार किया। इस (बेकार अनुकरणीय) समारोह को देखते हुए:जावा टर्नरी ऑपरेटर के ऑटो-मुक्केबाजी-व्यवहार के माध्यम से NullPointerException
Integer getNumber() {
return null;
}
मैं संकलन के बाद बिल्कुल समान होना करने के लिए निम्न दो कोड खंडों उम्मीद कर रहा था:
Integer number;
if (condition) {
number = getNumber();
} else {
number = 0;
}
बनाम
Integer number = (condition) ? getNumber() : 0;
।
, if
-statement ठीक काम करता है निकलती है तो condition
true
है, जबकि दूसरा कोड खंड में त्रिगुट opration एक NullPointerException
फेंकता है। ऐसा लगता है कि टर्नरी ऑपरेशन ने ऑटो-मुक्केबाजी से पहले में परिणाम दोनों विकल्पों को int
पर टाइप-कास्ट करने का निर्णय लिया है! वास्तव में, अगर मैंने स्पष्ट रूप से 0
को Integer
पर डाला है, तो अपवाद दूर हो जाता है। दूसरे शब्दों में:
Integer number = (condition) ? getNumber() : (Integer) 0;
:
Integer number = (condition) ? getNumber() : 0;
नहीं के समान है।
तो, ऐसा लगता है कि टर्नरी ऑपरेटर और समकक्ष if-else
-स्टेटमेंट (कुछ जो मुझे उम्मीद नहीं थी) के बीच बाइट-कोड अंतर है। जो तीन प्रश्न उठाता है: इसमें कोई अंतर क्यों है? क्या यह टर्नरी कार्यान्वयन में एक बग है या क्या टाइप कास्ट का कोई कारण है? यह देखते हुए कि एक अंतर है, क्या टर्नरी ऑपरेशन बराबर if
-स्टेटमेंट (मुझे पता है, अंतर बड़ा नहीं हो सकता है, लेकिन अभी भी) की तुलना में कम या ज्यादा प्रदर्शन करने वाला है?
आप गंभीरता से मानते हैं कि दस्तावेज़ के उपयोग और ऑपरेटर के प्रतिबंधों की आपकी * समझ * के बजाय टर्नरी ऑपरेटर में एक बग है? आपको क्या लगता है कि इस वास्तविक रूप से होने वाली बाधाएं हैं? अपने प्रश्न के शीर्षक को "टर्नरी ऑपरेटर कैसे काम करता है" में गलतफहमी को बदलने पर विचार करें। –
यही कारण है कि मैं सवाल पूछ रहा हूं कि क्यों संकलक निर्णय लेता है कि getNumber() और 0 दोनों को int को मूल्यांकन करना चाहिए यदि मैं एक इंटीजर को परिणाम सौंपता हूं। मेरे लिए, तुलना के बाद वास्तव में आवश्यक प्रकार की तुलना में तुलना के मुकाबले दो प्रकार के अधिक प्रतिबंधक को दो तर्कों को डालने का बिल्कुल कोई मतलब नहीं है। Unboxing के माध्यम से क्यों जाना है और फिर getNumber() reboxing? –
इससे कोई फर्क नहीं पड़ता कि आपको क्या लगता है या मुझे लगता है * होना चाहिए। इसके बजाय जो भी मायने रखता है वह जेएलएस में स्पष्ट रूप से दस्तावेज किया गया है। –