जावा में नल के खिलाफ स्ट्रिंग की जांच कैसे करें?


91

मैं जावा में नल के खिलाफ एक स्ट्रिंग की जांच कैसे कर सकता हूं? मै इस्तेमाल कर रहा हूँ

stringname.equalsignorecase(null)

लेकिन यह काम नहीं कर रहा है।

जवाबों:


163

string == nullतुलना करता है यदि वस्तु अशक्त है। string.equals("foo")उस वस्तु के अंदर के मूल्य की तुलना करता है। string == "foo"हमेशा काम नहीं करता है, क्योंकि आप यह देखने की कोशिश कर रहे हैं कि ऑब्जेक्ट समान हैं, न कि वे मान जो वे प्रतिनिधित्व करते हैं।


दीर्घ उत्तर:

यदि आप यह कोशिश करते हैं, तो यह काम नहीं करेगा, जैसा कि आपने पाया है:

String foo = null;
if (foo.equals(null)) {
    // That fails every time. 
}

इसका कारण यह है कि फू शून्य है, इसलिए यह नहीं पता कि असमानता क्या है; असमानों से बुलाने के लिए कोई वस्तु नहीं है।

जो आप शायद चाहते थे:

String foo = null;
if (foo == null) {
    // That will work.
}

स्ट्रिंग्स के साथ काम करते समय एक अशक्त के खिलाफ खुद को बचाने का विशिष्ट तरीका है:

String foo = null;
String bar = "Some string";
...
if (foo != null && foo.equals(bar)) {
    // Do something here.
}

इस तरह, अगर फू शून्य था, तो यह सशर्त की दूसरी छमाही का मूल्यांकन नहीं करता है, और चीजें ठीक हैं।

यदि आप एक स्ट्रिंग शाब्दिक (एक चर के बजाय) का उपयोग कर रहे हैं, तो आसान तरीका है:

String foo = null;
...
if ("some String".equals(foo)) {
    // Do something here.
}

यदि आप उस के आसपास काम करना चाहते हैं, तो Apache Commons में एक वर्ग है - StringUtils - जो अशक्त-सुरक्षित संचालन प्रदान करता है।

if (StringUtils.equals(foo, bar)) {
    // Do something here.
}

एक अन्य प्रतिक्रिया मजाक कर रही थी, और कहा कि आपको यह करना चाहिए:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

कृपया ऐसा मत करो। आपको केवल उन त्रुटियों के लिए अपवाद फेंकना चाहिए जो असाधारण हैं; यदि आप अशक्त होने की उम्मीद कर रहे हैं, तो आपको समय से पहले इसकी जांच करनी चाहिए, और अपवाद को फेंकने नहीं देना चाहिए।

मेरे सिर में, इसके दो कारण हैं। पहले, अपवाद धीमे हैं; अशक्त के खिलाफ जाँच तेज है, लेकिन जब जेवीएम एक अपवाद फेंकता है, तो इसमें बहुत समय लगता है। दूसरा, कोड को पढ़ना और बनाए रखना बहुत आसान है यदि आप समय से पहले केवल नल पॉइंटर की जांच करते हैं।


2
आप Yoda संस्करण से चूक गए, यह भी हर बार काम करता है: अगर ("foo" .equalsIgnoreCase (स्ट्रिंग))
Omry Yadan

2
अच्छी सहायक व्याख्या। अच्छा खेलने के लिए धन्यवाद।
james.garriss

@aioobe मुझे लगता है कि हम सहमत हैं? यदि आप अधिक स्पष्ट हो सकते हैं, तो संपादित करना खुशी होगी।
डीन जे

30
s == null

काम नहीं करेगा?


4
@ k38: आपको "केवल" का उपयोग equals()करना होगा यदि आप मूल्यों की तुलना करना चाहते हैं । लेकिन अगर आप यह जांचना चाहते हैं कि एक चर है null, तो आप उपयोग करते हैं ==
फेलिक्स क्लिंग

18

ज़रूर काम करता है। आपको कोड का एक महत्वपूर्ण हिस्सा याद आ रहा है। आपको बस इस तरह की आवश्यकता है:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

;)


23
यदि आप इसे दूर पढ़ रहे हैं, तो कृपया महसूस करें कि @aioobe मजाक कर रहा है; आपको इसे इस तरह नहीं करना चाहिए।
डीन जे

12

Android में काम कर रहे हैं, तो TextUtils विधि का प्रयोग करें।

TextUtils.isEmpty (str) : स्ट्रिंग के शून्य या 0-लंबाई होने पर वापस लौटाता है। पैरामीटर: स्ट्रिंग की जांच की जाने वाली वापसी: सच है अगर str शून्य या शून्य लंबाई है

  if(TextUtils.isEmpty(str)) {
        // str is null or lenght is 0
    }

नीचे इस पद्धति का स्रोत कोड है। आप direclty का उपयोग कर सकते हैं।

 /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }

5

यदि हम इक्वलाइंसकोर विधि के कार्यान्वयन को देखते हैं, तो हमें यह भाग मिलता है:

if (string == null || count != string.count) {
    return false;
}

falseयदि यह तर्क है तो यह हमेशा वापस आ जाएगा null। और यह स्पष्ट रूप से सही है, क्योंकि एकमात्र मामला जहां इसे वापस लौटना चाहिए trueजब equalsIgnoreCase को एक null String, लेकिन एक पर लागू किया गया था

String nullString = null;
nullString.equalsIgnoreCase(null);

निश्चित रूप से एक NullPointerException में परिणाम होगा।

तो समान विधियों का परीक्षण करने के लिए डिज़ाइन नहीं किया गया है कि क्या कोई वस्तु अशक्त है, सिर्फ इसलिए कि आप उन पर आक्रमण नहीं कर सकते null


4

यह थोड़ा अजीब लगता है, लेकिन ...

stringName == null || "".equals(stringName)

कभी भी इस तरह से कोई समस्या नहीं थी, इसके अलावा संभावित अशक्त बिंदु अपवादों से बचने के लिए यह एक सुरक्षित तरीका है।


इस स्थिति में NullPointer से सावधान रहें दूसरी स्थिति पहले होनी चाहिए।
पवन

3

मुझे यकीन नहीं है कि MYYN के जवाब में क्या गलत था।

if (yourString != null) {
  //do fun stuff with yourString here
}

उपरोक्त अशक्त जाँच काफी ठीक है।

यदि आप जांचने की कोशिश कर रहे हैं कि क्या स्ट्रिंग संदर्भ समान है (मामले को अनदेखा कर रहा है) जो आपको पता है कि यह एक शून्य संदर्भ नहीं है, तो कुछ इस तरह से करें:

String x = "this is not a null reference"
if (x.equalsIgnoreCase(yourStringReferenceThatMightBeNull) ) {
  //do fun stuff
}

यदि आपके द्वारा तुलना की जा रही दोनों स्ट्रिंग्स के लिए आपके पास अशक्त संदर्भ हैं या नहीं, इस बारे में कोई संदेह है, तो आपको NullPointerException की संभावना से बचने के लिए उनमें से कम से कम एक पर एक अशक्त संदर्भ की जांच करनी होगी।


2

यदि आपके स्ट्रिंग में "अशक्त" मान है, तो आप उपयोग कर सकते हैं

if(null == stringName){

  [code]

}

else

[Error Msg]

3
null == stringName और stringName == null क्यों नहीं? मैं मानता हूं कि कोई अंतर नहीं है लेकिन इसे क्यों पसंद किया जाता है (और मैंने इसे बहुत देखा है)। मेरी प्राथमिकता एलटीआर आदेश को पढ़ रही है इसलिए स्ट्रिंग == शून्य लेकिन यह जानना चाहते हैं कि अन्य लोग क्या सोचते हैं।
लुकाज़ 'सेवरियान' ग्रीला

7
आम तौर पर तुलना में आप चर को दाईं ओर रखते हैं, ताकि आप गलती पर चर को इनिशियलाइज़ न करें: null = stringName एक संकलित त्रुटि पैदा करता है जबकि stringName = null संभव होगा
साराजोग

4
ऐसा करना बिल्कुल भी सामान्य नहीं है और कई लोग स्पष्ट रूप से मना करते हैं क्योंकि यह स्वाभाविक रूप से कोड बेस पढ़ने वाले किसी व्यक्ति के लिए पठनीय नहीं है।
रिची एचएच

2

इसे अपनी कक्षा में आयात करें

import org.apache.commons.lang.StringUtils;

फिर इसका उपयोग करें, वे दोनों सच वापस आ जाएंगे

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 

2

आप स्ट्रिंग == अशक्त के साथ देख सकते हैं

यह मेरे लिए काम करता है

    String foo = null;
    if(foo == null){
        System.out.println("String is null");
    }

1

बेशक user351809, stringname.equalsignorecase(null)NullPointerException को फेंक देगा।
देखें, आपके पास एक स्ट्रिंग ऑब्जेक्ट है stringname, जो 2 संभावित स्थितियों का अनुसरण करता है: -

  1. stringnameकुछ गैर-शून्य स्ट्रिंग मान है ("कंप्यूटर" कहें):
    आपका कोड ठीक काम करेगा क्योंकि यह फ़ॉर्म लेता है
    "computer".equalsignorecase(null)
    और आपको अपेक्षित प्रतिक्रिया मिलती है false
  2. stringnameएक nullमान है:
    यहाँ आपका कोड अटक जाएगा,
    null.equalsignorecase(null)
    हालाँकि, पहली नज़र में अच्छा लगता है और आप के रूप में प्रतिक्रिया की उम्मीद कर सकते हैं true,
    लेकिन, nullएक ऐसा equalsignorecase()तरीका नहीं है जो विधि को निष्पादित कर सकता है ।

इसलिए, आपको मामले के कारण अपवाद मिलता है। 2.
मैं आपको जो सुझाव देता हूं वह बस उपयोग करना हैstringname == null



1

यदि valueलौटाया गया अशक्त है, तो उपयोग करें:

if(value.isEmpty());

कुछ समय के लिए अशक्त, if(value == null)जावा में, यह सच भी नहीं दे सकता है स्ट्रिंग भी अशक्त है।


1
स्काला (जावा के साथ) का उपयोग करना if(value.isEmpty())देता है NullPointerException। इस मामले में बेहतर उपयोग कर रहा हैif(value == null)
एंड्रिया

यह निश्चित रूप से गलत है क्योंकि यह हमेशा NPE फेंक देगा यदि अशक्त।
रोजर

1

जावा 7 के साथ आप उपयोग कर सकते हैं

if (Objects.equals(foo, null)) {
    ...
}

trueयदि दोनों पैरामीटर हैं तो वापस आ जाएंगे null


0

मुझे लगता है कि यह एक लंबे समय से पहले उत्तर दिया गया था, लेकिन मैंने इस पोस्ट को नहीं देखा है, इसलिए मैंने सोचा कि मैं जो करता हूं उसे साझा करूंगा। यह कोड पठनीयता के लिए विशेष रूप से अच्छा नहीं है, लेकिन यदि आप अशक्त चेक की एक श्रृंखला कर रहे हैं, तो मुझे उपयोग करना पसंद है:

String someString = someObject.getProperty() == null ? "" : someObject.getProperty().trim();

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


अशक्त या रिक्त के लिए जाँच का क्या अर्थ है? आप यहाँ केवल शून्य की जाँच कर रहे हैं। रिक्त "COND? A: B;" के संभावित रिटर्न में से एक है। निर्माण, सही?
फिलो विवरो

0

अगर मैं सही तरीके से समझूं, तो यह करना चाहिए:

if(!stringname.isEmpty())
// an if to check if stringname is not null
if(stringname.isEmpy())
// an if to check if stringname is null

-2

खैर, पिछली बार किसी ने यह मूर्खतापूर्ण सवाल पूछा था, जवाब था:

someString.equals("null")

यह "फिक्स" केवल पहली जगह में कैसे nullहो जाता है की बड़ी समस्या को छुपाता है "null"


यह नहीं है - तो यह एक तय नहीं है और एक उपयोगी जवाब नहीं है।
क्रिस स्ट्रैटन

मैं सबसे पहले कहना चाहूंगा: "वाट"
फिलो विवरो

यह सवाल का जवाब नहीं देता है
जेसन

-2

इसे करने के दो तरीके हैं। Say String == null या string.equals () ।।

public class IfElse {

    public int ifElseTesting(String a){
        //return null;
        return (a== null)? 0: a.length();
    }

}

public class ShortCutifElseTesting {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        System.out.println("enter the string please:");
        String a=scanner.nextLine();
        /*
        if (a.equals(null)){
            System.out.println("you are not correct");
        }
        else if(a.equals("bangladesh")){
            System.out.println("you are right");
        }
        else
            System.out.println("succesful tested");

        */
        IfElse ie=new IfElse();
        int result=ie.ifElseTesting(a);
        System.out.println(result);

    }

}

इस उदाहरण की जांच करें..यदि इरेस के शॉर्टकट संस्करण का एक और उदाहरण है।


1
नहीं! .equals () का उपयोग संभावित रूप से अशक्त वस्तु के साथ नहीं किया जाना चाहिए, इसलिए परिचयात्मक स्पष्टीकरण गलत है। और इस उत्तर के बाकी बिंदु निरर्थक और पूछे गए प्रश्न से असंबंधित हैं।
क्रिस स्ट्रैटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.