2017-01-17 11 views
10

वापस करने का प्रयास करते समय इस प्रोग्राम को शून्य से फ़्लोट करने के लिए कॉल करते समय शून्य से बचने के लिए माना जाता है। लेकिन मैं अभी भी एनपीई हो रही है .. किसी भी मददएनपीई शून्य

System.out.println(toFloat(null, null));

private static Float toFloat(Float def, String str) { 
    try { 
     return str != null ? Float.parseFloat(str) : def; 
    } catch (NumberFormatException e) { 
     return def; 
    } 
} 

उत्तर

14

यह बहुत सूक्ष्म है। Float.parseFloatfloat लौटाता है, Float नहीं। एक सशर्त ऑपरेटर के दूसरे दो ऑपरेशन एक ही प्रकार के होने चाहिए, लेकिन आप इसे float (Float.parseFloat का परिणाम) और Float (def) दे रहे हैं। कंपाइलर float चुनता है क्योंकि Float ऑटो-अनबॉक्सिंग के माध्यम से float पर ले जाया जा सकता है।

तो क्या संकलक आउटपुट के रूप में यद्यपि आप इस लिखा था है:

private static Float toFloat(Float def, String str) { 
    try { 
     return str != null ? Float.parseFloat(str) : def.floatValue(); 
     // Note ----------------------------------------^^^^^^^^^^^^^ 
    } catch (NumberFormatException e) { 
     return def; 
    } 
} 

... और हां, बुला floatValuenull पर एक एनपीई फेंकता है।

तुम्हें यकीन दूसरे संकार्य के प्रकार Float, नहीं float है बनाकर इसे ठीक कर सकते हैं। तरीके कि ऐसा करने के लिए बहुत से, लेकिन Zefick points out के रूप में, सबसे सरल Float.valueOf(String) है:

private static Float toFloat(Float def, String str) { 
    try { 
     return str != null ? Float.valueOf(str) : def; 
    } catch (NumberFormatException e) { 
     return def; 
    } 
} 
+2

Float.valueOf (एसटीआर) – Zefick

+0

@Zefick: रवींद्र! हां वास्तव में ... –

+2

स्पष्टता के लिए मेरा सुझाव, '?' ऑपरेटर से छुटकारा पाने और सरल 'if' का उपयोग करना होगा। हां, आपके पास कोड की कुछ और पंक्तियां होंगी। लेकिन यह समझने में भी आसान तरीका होगा कि क्या हो रहा है, जबकि पार्सिंग और तुरंत पूंजी फ्लोट पर कास्टिंग करने से मुझे लगता है कि "क्या बिल्ली मैं वापस कर रहा था ..." कुछ महीने बाद ... :) - खैर 'valueOf' निश्चित रूप से सबसे आसान तरीका है ... दुह! – Quota

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