जावा: यदि ऑब्जेक्ट शून्य है तो कैसे जांचें?


87

मैं एक एप्लिकेशन बना रहा हूं जो वेब से छवियों को पुनर्प्राप्त करता है। यदि छवि को पुनः प्राप्त नहीं किया जा सकता है तो दूसरी स्थानीय छवि का उपयोग किया जाना चाहिए।

निम्नलिखित पंक्तियों को निष्पादित करने का प्रयास करते समय:

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
  drawable = getRandomDrawable();
}

यदि ड्रा करने योग्य है तो लाइन (drawable.equals (null)) एक अपवाद को फेंक देती है।

क्या किसी को पता है कि मामले में एक अपवाद को नहीं फेंकने के लिए ड्रॉबल के मूल्य की जांच कैसे की जानी चाहिए, क्योंकि यह अशक्त है और स्थानीय छवि को पुनः प्राप्त करता है (ड्रा करने योग्य = getRandomDrawable ()) को निष्पादित करें?


23
उपयोग करें यदि (drawable == null) NULL ऑब्जेक्ट पर किसी भी विधि को कॉल करना एक NullPointerException है।
१०:४०

3
आप एक टिप्पणी के बजाय एक सामान्य उत्तर क्यों नहीं लिखते हैं?
deamon

@JaredBurrows प्रश्न के उद्देश्य को पराजित करने वाले कोड को प्रश्न में इस तरह से संपादित नहीं करते हैं!
गिलेस एसओ- बुराई को रोकना '

@ गिल्स मेरी संपादकीय टिप्पणी पढ़ें, मैंने कोड को अधिक पठनीय बनाया।
जारेड बर्ग्स

@JaredBurrows नहीं, आपका संपादन "स्वरूपण" परिवर्तन नहीं था। आपने गैर-कार्यशील कोड को बदल दिया, जो कार्य कोड में प्रश्न का उद्देश्य था, जिसने प्रश्न को गलत बना दिया।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


35

संपादित जावा 8 समाधान:

final Drawable drawable = 
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
        .orElseGet(() -> getRandomDrawable());

आप drawable finalइस मामले में घोषणा कर सकते हैं ।

जैसा कि Chasmo ने बताया, Android फिलहाल जावा 8 का समर्थन नहीं करता है। तो यह समाधान केवल अन्य संदर्भों में संभव है।


7
शायद एक अच्छा विचार नहीं है - आप फोरट्रान 60 पर वापस जा रहे हैं जहां सशर्त के दोनों किनारों का मूल्यांकन किया जाता है, फिर केवल एक का उपयोग किया जाता है। यह बुरा है अगर अप्रयुक्त शाखा में कोई संगणना है, जो कि ज्यादातर समय सच है, इसलिए यह आम तौर पर उपयोगी तरीका नहीं है। मैं हालत को Commonकक्षा में ले जाऊंगा, और आपको फालबैक URL की आपूर्ति करने और जिम्मेदारियों को एक साथ रखने की अनुमति दूंगा।
पीट किर्कम

1
उदाहरण अब जावा 8 में पूरी तरह से फिर से लिखा गया है, इसलिए मेरा समाधान अब बेकार मूल्यांकन से ग्रस्त नहीं है (जैसा कि @PeteKirkham ने मेरे मूल समाधान में बताया है)।
बहमन

1
एंड्रॉइड जावा 8 का समर्थन नहीं करता है। यह केवल जावा 7 (यदि आपके पास किटकैट है) तक का समर्थन करता है और फिर भी इसमें इनवोकैनामिक नहीं है, केवल नई वाक्यविन्यास चीनी है। इसके अलावा, Optional.ofइसका मतलब है, कि मान शून्य नहीं है, और इसलिए orElseGetअनावश्यक है। आपको Optional.ofNullableइस मामले में उपयोग करना चाहिए ।
मार्टिन सीलर

179
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable == null) {
    drawable = getRandomDrawable();
}

equals()के लिए विधि चेकों मूल्य समानता, जिसका अर्थ है कि यह तुलना सामग्री दो वस्तुओं की। चूंकि nullकोई ऑब्जेक्ट नहीं है, इसलिए यह आपकी सामग्री की सामग्री की तुलना करने की कोशिश करते समय क्रैश हो जाता हैnull

==के लिए ऑपरेटर की जाँच करता संदर्भ समानता, जिसका अर्थ है कि यह लग रहा है कि क्या दो वस्तुओं वास्तव में कर रहे बहुत ही वस्तु । यह वास्तव में मौजूद वस्तुओं की आवश्यकता नहीं है; दो अलंकृत वस्तुएँ ( nullसंदर्भ) भी समान हैं।


56
मैं एक बहुत ही मूल्यवान टिप जोड़ना चाहता हूं: यदि आपके पास तुलना करने के लिए तार या लगातार हैं, तो उन्हें हमेशा बराबर खंड में रखें। (अगर ("coyote" .equals (myDogString)) की तुलना में बहुत बेहतर है (अगर (myDogString.equals ("coyote"))) क्योंकि दूसरे मामले में myDogString शून्य हो सकती है और पहले मामले में एक NPE फेंकता है जबकि यह नहीं होता है अगर मैडस्ट्रीमिंग अशक्त है तो कोई बात नहीं।
थोरस्टन एस।

20
एक योडा स्थिति के रूप में जाना जाता है: "अगर एक कोयोट, कुत्ता है ..."
थॉमस

1
मैं यह भी जोड़ना चाहूंगा, कि जावा 7 के बाद से एक ऑब्जेक्शंस () विधि है, कि चलो आप
यूडा

21

मैं इस दृष्टिकोण का उपयोग करता हूं:

if (null == drawable) {
  //do stuff
} else {
  //other things
}

इस तरह मुझे लगता है कि लाइन की पठनीयता में सुधार हुआ है - जैसा कि मैंने एक स्रोत फ़ाइल के माध्यम से जल्दी से पढ़ा है मैं देख सकता हूं कि यह एक अशक्त जांच है।

इस संबंध में कि आप .equals()किसी वस्तु पर कॉल क्यों नहीं कर सकते हैं null; यदि ऑब्जेक्ट संदर्भ आप (अर्थात् 'drawable') है है वास्तव में null, यह ढेर पर एक वस्तु को इंगित नहीं करता है। इसका मतलब है कि ढेर पर कोई वस्तु नहीं है जिस पर कॉल equals()सफल हो सकती है।

शुभकामनाएँ!


4
मैं भी अगर (<स्थिर> == <चर>) खुद को आकस्मिक असाइनमेंट से बचाने के तरीके के रूप में निर्माण करना पसंद करता हूं।
स्कॉट

8

DIY

private boolean isNull(Object obj) {
    return obj == null;
}

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (isNull(drawable)) {
    drawable = getRandomDrawable();
}

6
drawable.equals(null)

उपरोक्त रेखा ड्रॉबल ऑब्जेक्ट पर "बराबर (...)" विधि कहती है।

इसलिए, जब ड्रा करने योग्य शून्य नहीं है और यह एक वास्तविक वस्तु है, तो सभी "बराबरी (अशक्त)" पद्धति को कॉल करने के साथ-साथ अच्छी तरह से चला जाता है।

लेकिन जब "ड्रॉबल" शून्य होता है, तो इसका मतलब है कि अशक्त वस्तु पर "बराबरी (...)" विधि का अर्थ है, एक ऐसी वस्तु पर एक विधि को कॉल करना जो मौजूद नहीं है इसलिए यह "NullPointerException" को फेंकता है

यह जाँचने के लिए कि क्या कोई वस्तु मौजूद है और यह अशक्त नहीं है, निम्नलिखित का उपयोग करें

if(drawable == null) {
    ...
    ...
}

उपरोक्त स्थिति में, हम जाँच कर रहे हैं कि संदर्भ चर "drawable" अशक्त है या इसमें कुछ मान (अपनी वस्तु का संदर्भ) है, इसलिए यह जाँच योग्य नहीं है, यदि जाँच योग्य है तो जाँच योग्य नहीं है

null == null

यह सही है।


5

if (yourObject instanceof yourClassName)falseयदि yourObjectहै तो मूल्यांकन करेगा null


0

शायद NullPointerException को पकड़ने के लिए यह थोड़ा अधिक कुशल है। उपरोक्त विधियों का मतलब है कि रनटाइम दो बार अशक्त बिंदुओं की जाँच कर रहा है।


1
if x == nullसमाधान में दोहरी जांच कहां है ?
deamon

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

4
यह नियंत्रण प्रवाह के रूप में अपवादों का उपयोग करते हुए, पारंपरिक ज्ञान के खिलाफ जाता है।
जेम्स

1
अपवाद बहुत महंगे हैं, क्योंकि उन्हें एक संपूर्ण स्टैकट्रेस बनाने की आवश्यकता है।
बहमन


-1

बस जावा सोर्स डेवलपर :-) को कुछ विचार देने के लिए

समाधान पहले से ही .Net में मौजूद है और अधिक पठनीय है!

Visual Basic .Net में

Drawable drawable 
    = If(Common.getDrawableFromUrl(this, product.getMapPath())
        ,getRandomDrawable()
        )

C # में

Drawable drawable 
    = Common.getDrawableFromUrl(this, product.getMapPath() 
        ?? getRandomDrawable();

ये समाधान वैकल्पिक जावा समाधान के रूप में शक्तिशाली हैं (डिफ़ॉल्ट स्ट्रिंग केवल मूल्यांकन किया जाता है यदि मूल मूल्य शून्य है) लैम्बडा अभिव्यक्ति का उपयोग किए बिना, बस एक नया ऑपरेटर जोड़ने में।

बस जावा समाधान के साथ अंतर को जल्दी से देखने के लिए, मैंने 2 जावा समाधान जोड़े हैं

जावा में वैकल्पिक का उपयोग करना

Drawable drawable = 
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
        .orElseGet(() -> getRandomDrawable());

जावा में {} का उपयोग करना

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable != null)
    {
    drawable = getRandomDrawable();
    }

निजी तौर पर, मुझे VB.Net पसंद है लेकिन मैं जावा में पसंद करता हूं ?? C#या if {}समाधान ... और आप?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.