2013-04-26 4 views
15

यह मुझे लगता है कि जावा purists के लिए एक है। मुझे हाल ही में एक बूलियन को स्ट्रिंग मानों का एक कस्टम पार्सिंग करने के लिए एक विधि के साथ एक मुद्दा था। एक साधारण पर्याप्त काम है, लेकिन किसी कारण अशक्त मामले में एक NullPointerException फेंकने विधि से नीचे था के लिए ...बुलीयन से NullPointerException

static Boolean parseBoolean(String s) 
{ 
    return ("1".equals(s) ? true : ("0".equals(s) ? false : null)); 
} 

बूलियन तो क्यों या कैसे एक NullPointerException फेंकी जा सकती है विधि के लिए वापसी प्रकार किया जाता है? इसके माध्यम से डीबगिंग से ऐसा लगता है कि अपवाद को उस बिंदु पर फेंक दिया जा रहा है जहां नेस्टेड इन-लाइन सशर्त स्टेटमेंट शून्य के मूल्यांकन का मूल्यांकन करता है और बाहरी इन-लाइन सशर्त में वापस लौटाता है, लेकिन फिर मैं समझा नहीं सकता कि क्यों।

static Boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 
    if ("0".equals(s)) return false; 

    return null; 
} 

निम्नलिखित कोड दोनों के बीच आधे रास्ते है और यह भी काम करता है के रूप में उम्मीद:

अंततः मैं, के रूप में इस प्रकार है जो अपेक्षा के अनुरूप काम करता छोड़ दिया और विधि दुबारा लिखा

static Boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 

    return "0".equals(s) ? false : null; 
} 
+2

+1 एक अच्छा "गूढ़ व्यक्ति" – NilsH

+0

@NilsH +1 के लिए धन्यवाद, और समाधान के लिए! – Robin

उत्तर

13

यह भी काम करता है:

static Boolean parseBoolean(String s) 
{ 
    return ("1".equals(s) ? Boolean.TRUE : ("0".equals(s) ? Boolean.FALSE : null)); 
} 

तो कारण है कि आप एक एनपीई autoboxing क्योंकि त्रिगुट ऑपरेटर में boolean का उपयोग कर का कारण बनता है अभिव्यक्ति का परिणाम एक boolean के रूप में देखा जाना चाहिए की वजह से है मिलता है। और null का अन-मुक्केबाजी एनपीई का कारण बनता है।

+1

+1 अच्छी तरह से किया गया। कोड को देखने पर कोई मूल नहीं सोचता है। –

+0

अच्छा जवाब @Nils - फिसलन छोटे शैतान कि एक! मैंने 'बूलियन' स्थिरांक का उपयोग करने के बारे में सोचा नहीं था। – Robin

8

मेरे सुझाव? Boolean लौट मत करो, boolean लौट सकते हैं और एक अपवाद फेंक:

static boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 
    if ("0".equals(s)) return false; 

    throw new IllegalArgumentException(s + " is not a boolean value."); 
} 

की तरह एक दृष्टिकोण अपनाने ऊपर आप गलती से एक अशक्त Boolean वस्तु को संदर्भित से बचने में मदद मिलेगी।

excellent answer from NilsH देखें कि आपकी मूल विधि अपवाद क्यों फेंक रही है।

+1

मैं सहमत हूं। बाद में एनपीई में दौड़ने से तेज़ी से असफल होना बेहतर होता है। हालांकि, अगर किसी को "त्रि राज्य" समाधान की आवश्यकता होती है तो एक बूलियन का उपयोग होता है। – NilsH

+0

यह एक त्रि-राज्य की स्थिति है, इसलिए मुझे उम्मीदवारों के लिए वास्तव में अपवाद फेंकना नहीं चाहिए! वैसे भी अपवाद हैंडलिंग को और भी महंगा नहीं है? – Robin

2

दिलचस्प लेकिन कोई जवाब नहीं आप बताता क्यों इस पहली जगह में होता है।

इसे टर्नरी अभिव्यक्ति के साथ करना है।

संकलक बुलियन के शून्य संदर्भ के रूप में शून्य को समझता है, बूलियन (एक शून्य पर) के लिए ऑटोबॉक्सिंग/अनबॉक्सिंग नियम लागू करता है => आपको रनटाइम पर एक NullPointerException मिलता है।

+2

मुझे लगता है कि आपको उत्तरों को दोबारा पढ़ना होगा;) – NilsH

+1

@NilsH शायद लेखन के समय आपके इस हिस्से को याद किया। :) मुझसे +1। – Eugene

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