जांचें कि क्या नल बूलियन अपवाद में सही परिणाम है


169

मेरे पास निम्नलिखित कोड हैं:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

बूलियन चर "बूल" पर मेरा चेक अप एक अपवाद में क्यों होता है? अगर यह "सत्य" नहीं है तो क्या यह सही है कि यदि यह कथन "अतीत" में कूद जाए? जब मैं इफ स्टेटमेंट हटाता हूं या चेक करता हूं कि क्या यह शून्य नहीं है, तो अपवाद दूर हो जाता है।


3
ऑब्जेक्ट अनबॉक्सिंग के बारे में उपरोक्त उत्तर सभी सही हैं। पूर्णता के लिए, हालाँकि, आप ऑब्जेक्ट रैपर "बूलियन" के बजाय आदिम "बूलियन" का उपयोग करने के लिए अपना कोड भी बदल सकते हैं। आपको एक आदिम और एक वस्तु के बीच के अंतर पर खुद को ताज़ा करना चाहिए।
मार्वो

इस बीच, if (bool == Boolean.TRUE)एक अपवाद उत्पन्न किए बिना झूठ का मूल्यांकन करता है। यकीन नहीं होता है कि अगर मैं अभी पाया मामले में यह जानबूझकर था।
simon.watts

2
@ simon.watts कि के लिए झूठी होगा boolजा रहा है nullया अगर Boolean(करने के लिए संदर्भ के रूप में और नहीं स्पष्ट रूप से निर्माण किया गया था Boolean.TRUE)। तो अनुशंसित नहीं; विरोध के रूप में if (Boolean.TRUE.equals(bool))जो उम्मीद के मुताबिक काम करेगा, जिसमें सुरक्षित रूप से nullमूल्य संभालना शामिल है ।
स्टैक्मैन मैन

जवाबों:


171

जब आप एक है booleanयह हो सकता है या तो trueया false। फिर भी यदि आप एक है जब Booleanयह या तो हो सकता है Boolean.TRUE, Boolean.FALSEया nullकिसी अन्य वस्तु के रूप में।

अपने विशेष मामले में, अपने Booleanहै nullऔर ifबयान के एक अंतर्निहित रूपांतरण ट्रिगर booleanहै कि पैदा करता है NullPointerException। आपको इसके बजाय आवश्यकता हो सकती है:

if(bool != null && bool) { ... }

23
तकनीकी रूप Booleanसे सही उदाहरणों की संख्या हो सकती है, न कि सिर्फ Boolean.TRUE। उदाहरण के लिए new Boolean(true)
स्टीव कू

1
मैं यह समझने के लिए संघर्ष करता हूं कि क्यों if (myBoolean)(जहां myBooleanहै Boolean) एक संकलक त्रुटि या कम से कम चेतावनी नहीं उठाता है। यह सुनिश्चित करने के लिए एक गोच है।
जोश एम।

1
@JoshM। ऐसा इसलिए है क्योंकि Java रैपरों की बॉक्सिंग और अनबॉक्सिंग करता है : docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Vinicius

3
@Vinicius यकीन है, लेकिन संकलक या तो इस मामले में हमारे लिए अशक्त करना चाहिए, कम से कम संकलक चेतावनी के माध्यम से बाहर।
जोश एम।

2
@JoshM। अधिक सहमत नहीं हो सकते :)
विनीसियस

402

यदि आपको अतिरिक्त अशक्त जांच पसंद नहीं है:

if (Boolean.TRUE.equals(value)) {...}

1
@ArrDragon: क्या समान की आवश्यकता है? ऑपरेटर == यहाँ काम करता है क्योंकि बूलियन के केवल दो मूल्य हैं
अतुल

7
@ अतुल हां, यहां बराबर की आवश्यकता है। क्योंकि (नया बुलियन (सच्चा) == नया बुलियन (सच्चा) है .... असत्य। कारण: बूलियन सिर्फ एक वर्ग है और जावा में किसी भी अन्य वर्ग के रूप में कई उदाहरण हो सकते हैं।
AvrDragon

35
हाँ, यह शर्म की बात है, कंस्ट्रक्टर निजी होना चाहिए ताकि यह सुनिश्चित हो कि यह एक ट्विंगटन है ...
फोरट्रान

15
"ट्विंगटन" के लिए @fortran +1।
बेनेट McElwee

1
इस मुहावरे पर Apache BooleanUtils का उपयोग करने का कोई मतलब नहीं है।
स्टेक्समैन

82

अपाचे बूलियन यूटिल्स का उपयोग करें ।

(यदि आपकी परियोजना में शिखर प्रदर्शन सबसे महत्वपूर्ण प्राथमिकता है, तो मूल समाधान के लिए अन्य उत्तरों में से एक को देखें, जिसमें बाहरी पुस्तकालय की आवश्यकता नहीं है।)

पहिया को सुदृढ़ मत करो। उत्तोलन क्या पहले से ही बनाया गया है और उपयोग करें isTrue():

BooleanUtils.isTrue( bool );

जाँचता है कि क्या कोई Booleanमान सत्य है, nullवापस लौटकर false

यदि आप उन पुस्तकालयों तक सीमित नहीं हैं जिन्हें आपको शामिल करने की अनुमति है, तो सभी प्रकार के उपयोग-मामलों के लिए, Booleansऔर सहित, महान सहायक कार्यों का एक समूह है Strings। मेरा सुझाव है कि आप विभिन्न अपाचे पुस्तकालयों को भ्रमित करें और देखें कि वे पहले से ही क्या पेशकश कर रहे हैं।


59
पहिया को फिर से शुरू करना इतना बुरा नहीं लगता है जब विकल्प बाहरी पुस्तकालय का उपयोग कर रहा है क्योंकि यह मूल रूप से कुछ के लिए है।
पॉल मंटा

3
@PaMManta मैं मानता हूं कि यदि आप अपाचे यूटिल्स लाइब्रेरी में कभी भी यही प्रयोग करेंगे , लेकिन सुझाव दिया गया है कि पुस्तकालयों को अन्य सहायक कार्यों के लिए खुद को बेनकाब करना है।
जोशुआ पिंटर

1
इन पुस्तकालयों का उपयोग करने के लिए एक प्रदर्शन दंड है। तो ऐसी बुनियादी चीजों के लिए जो भाषा का हिस्सा हैं, आपको पुस्तकालयों का उपयोग नहीं करना चाहिए।
एसीवी

6
वह पुस्तकालय पहिया को फिर से मजबूत कर रहा है। मैं यथासंभव ऐसे पुस्तकालयों से बचने का प्रयास करता हूं।
mschonaker

3
@mschonaker यदि Apache BooleanUtils पहिया को फिर से स्थापित कर रहा है, तो मूल पहिया क्या है ? विचार सहायक कार्यों का एक समूह बनाने से बचने के लिए है जो इस तरह के पुस्तकालयों में पहले से ही किया गया है की नकल करते हैं। मैं toStringYesNoअपने सभी अनुप्रयोगों में इस पुस्तकालय से भी उपयोग करता हूं।
जोशुआ पिन्टर

13

Booleanप्रकार हो सकते हैं nullnullजैसा कि आपने इसे सेट किया है, आपको एक चेक करने की आवश्यकता है null

if (bool != null && bool)
{
  //DoSomething
}                   

3
इस उत्तर में क्या गलत है? यह उस बूल की जाँच नहीं है जो अपवाद को फेंक रहा होगा। अनावश्यक उतार-चढ़ाव।
डोडेक्साहेड्रोन

2
मैं मानता हूं कि यह पूरी तरह से उचित जवाब है। आप हालांकि अपवाद हैंडलिंग से छुटकारा पा सकते हैं।
मार्वो

14
अपवाद सौंपना अनावश्यक है, और इसके बगल में एक तरह से किया जा रहा है जो शुरुआती लोगों के लिए एक बुरा उदाहरण है। यह एक गिरावट का पात्र है, IMO। (हाँ ... मुझे पता है कि यह उदाहरण कोड से आता है, लेकिन उत्तर में इसे दोहराने से इसका समर्थन होता है।)
स्टीफन सी।

1
फिर रास्ता क्या है? मुझे आपका जवाब यहाँ नहीं दिख रहा है।
मार्वो

5
सही तरीका यह है कि ऊपर वाला..कोई अपवाद हैंडलिंग नहीं है। साथ ही, अपवाद हैंडलिंग बहुत सामान्य है और हतोत्साहित किया जाता है।
वेलविशर

8

या जावा 8 वैकल्पिक की शक्ति के साथ, आप इस तरह की चाल भी कर सकते हैं:

Optional.ofNullable(boolValue).orElse(false)

:)


5

बूलियन आदिम बूलियन के लिए ऑब्जेक्ट रैपर क्लास है। यह वर्ग, किसी भी वर्ग के रूप में, वास्तव में अशक्त हो सकता है। प्रदर्शन और स्मृति कारणों से यह हमेशा आदिम का उपयोग करने के लिए सबसे अच्छा है।

जावा एपीआई में आवरण कक्षाएं दो प्राथमिक उद्देश्यों की सेवा करती हैं:

  1. किसी ऑब्जेक्ट में "रैप" आदिम मूल्यों को एक तंत्र प्रदान करने के लिए ताकि आदिम वस्तुओं के लिए आरक्षित गतिविधियों में शामिल किया जा सके, जैसे कि संग्रह में जोड़ा जा रहा है, या ऑब्जेक्ट रिटर्न वैल्यू के साथ एक विधि से लौटा है।
  2. आदिमों के लिए उपयोगिता कार्यों का वर्गीकरण प्रदान करना। इनमें से अधिकांश फ़ंक्शंस विभिन्न रूपांतरणों से संबंधित हैं: स्ट्रिंग से ऑब्जेक्ट्स के लिए प्राइमेटिव्स को कनवर्ट करना, और प्राइमेटिव्स और स्ट्रिंग ऑब्जेक्ट्स को बाइनरी, ऑक्टल और हेक्साडेसिमल जैसे विभिन्न आधारों (या मूलांक) से परिवर्तित करना।

http://en.wikipedia.org/wiki/Primitive_wrapper_class


0

जैसा कि आपका चर बूल एक अशक्त की ओर इशारा कर रहा है, तो आपको हमेशा एक NullPointerException मिलेगी, आपको चर को पहले कहीं शून्य मान से प्रारंभ करने की आवश्यकता नहीं है, और फिर इसे संशोधित करें।


1
अगर ऐसा catchहोता , तो ब्लॉक NullPointerException को हैंडल करता। यहां समस्या यह है कि ओपी एक मूल-संदर्भ में अशक्त-संदर्भ को अनबॉक्स करने का प्रयास करता है।
माइक एडलर

"आप हमेशा" - हमेशा नहीं, नमूना को छोड़कर, सरलीकृत कोड जो चर को शुरू करने nullऔर फिर परीक्षण करने के बीच में कुछ भी नहीं करता है। संभवतः वास्तविक कोड इतना सरल नहीं होगा या पूरी ifपरीक्षा को हटाया जा सकता है।
nnnnnn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.