2015-04-14 9 views
21

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

public double getSomeDouble() { 
    return "" != null ? 3.7d : null; 
} 

मैं सामान्य रूप से Eclipse एक त्रुटि के रूप में चिह्नित की उम्मीद करेंगे (null एक double आदिम को चालू नहीं किया जा सकता है)।

बस मेरी धारणा वापस करने के लिए, इस कोड काम करेगा नहीं:

public double getSomeDouble() { 
    return null; 
} 

ग्रहण त्रुटि के रूप में return null लाइन को चिह्नित करना होगा, उन्होंने कहा:

प्रकार बेमेल: double

को null से परिवर्तित नहीं कर सकते

यह पिछले कोड स्निपेट पर एक ही चीज़ क्यों नहीं कहता है ?!

+0

(http://stackoverflow.com/q/8098953/1391249) – Tiny

उत्तर

23

यह 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 
+4

हालांकि त्रुटि कारण अब स्पष्ट है, मैं अभी भी मेरे लिए उन लोगों को ट्रैक करने के लिए ग्रहण कंपाइलर सेट करना चाहते हैं (रनटाइम में जो बहुत देर हो चुकी है :(), क्या आप एक तरह से जानते हैं? –

+2

https://bugs.eclipse.org/bugs/show_bug.cgi?id= 163065 – Guillaume

+0

@MaximRahlis: मुझे डर है कि मैं नहीं करता। ऐसा लगता है कि Guillaume को एक फीचर अनुरोध मिला है जिसे आप देखना चाहते हैं ... –

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