यह autoboxing और autounboxing के कारण है। यदि आप बाइटकोड (नीचे) देखते हैं, तो आप Double.valueOf
पर कॉल देख सकते हैं (3.7d
मुक्केबाजी) और Double#doubleValue
(सशर्त अभिव्यक्ति के परिणाम को अनबॉक्सिंग)। सशर्त ऑपरेटर के लिए ऑपरेंड, एक ही प्रकार होना चाहिए, ताकि संकलक प्रभावी रूप से इस में अपने कोड हो रहा है: यह 3.7d
और null
के लिए मिल सकता है
public double getSomeDouble() {
return ("" != null ? Double.valueOf(3.7d) : null).doubleValue();
}
... क्योंकि Double
सबसे विशिष्ट आम प्रकार है।
public double getSomeDouble(String str) {
return str != null ? 3.7d : null;
}
जो प्रभावी रूप से हो जाता है
:
मैं (अपरिवर्तनीय अभिव्यक्ति "" != null
, जो संकलक बताने के लिए सक्षम हो जाएगा चारों ओर संकलक अनुकूलन खत्म करने के लिए सच हो कभी नहीं होगा) एक स्ट्रिंग तर्क का इस्तेमाल किया
public double getSomeDouble(String str) {
return (str != null ? Double.valueOf(3.7d) : null).doubleValue();
}
... और वास्तव में के लिए null
में पर null
पर कॉल करने का प्रयास करते समय रनटाइम पर एनपीई मिला।
यहाँ के लिए बाईटकोड मेरी getSomeDouble(String)
(javap -c MyClass
से): [? संबंधित]
public double getSomeDouble(java.lang.String);
Code:
0: aload_1
1: ifnull 13
4: ldc2_w #7 // double 3.7d
7: invokestatic #9 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
10: goto 14
13: aconst_null
14: invokevirtual #10 // Method java/lang/Double.doubleValue:()D
17: dreturn
स्रोत
2015-04-14 09:55:52
(http://stackoverflow.com/q/8098953/1391249) – Tiny