Wie prüfe ich einen String gegen Null in Java?


91

Wie kann ich eine Zeichenfolge in Java gegen Null prüfen? ich benutze

stringname.equalsignorecase(null)

aber es funktioniert nicht.

Antworten:


163

string == nullvergleicht, ob das Objekt null ist. string.equals("foo")vergleicht den Wert innerhalb dieses Objekts. string == "foo"funktioniert nicht immer, weil Sie versuchen zu sehen, ob die Objekte gleich sind, nicht die Werte, die sie darstellen.


Längere Antwort:

Wenn Sie dies versuchen, funktioniert es nicht, wie Sie festgestellt haben:

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

Der Grund ist, dass foo null ist und daher nicht weiß, was .equals ist. Es gibt dort kein Objekt, von dem .equals aufgerufen werden können.

Was Sie wahrscheinlich wollten, war:

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

Der typische Weg, sich im Umgang mit Strings vor einer Null zu schützen, ist:

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

Auf diese Weise wird, wenn foo null war, die zweite Hälfte der Bedingung nicht bewertet, und alles ist in Ordnung.

Wenn Sie ein String-Literal (anstelle einer Variablen) verwenden, ist der einfache Weg:

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

Wenn Sie das umgehen möchten, verfügt Apache Commons über eine Klasse - StringUtils -, die null-sichere String-Operationen bereitstellt.

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

Eine andere Antwort war ein Scherz und sagte, dass Sie dies tun sollten:

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

Bitte tu das nicht. Sie sollten nur Ausnahmen für außergewöhnliche Fehler auslösen. Wenn Sie eine Null erwarten, sollten Sie diese im Voraus prüfen und nicht zulassen, dass sie die Ausnahme auslöst.

In meinem Kopf gibt es zwei Gründe dafür. Erstens sind Ausnahmen langsam; Das Prüfen gegen Null ist schnell, aber wenn die JVM eine Ausnahme auslöst, dauert es sehr lange. Zweitens ist der Code viel einfacher zu lesen und zu warten, wenn Sie nur vorher nach dem Nullzeiger suchen.


2
Sie haben die Yoda-Version verpasst, funktioniert auch jedes Mal: ​​if ("foo" .equalsIgnoreCase (string))
Omry Yadan

2
Schöne hilfreiche Erklärung. Danke, dass du nett gespielt hast.
James.garriss

@aioobe Ich denke wir sind uns einig? Wenn Sie klarer sein können, bearbeiten Sie gerne.
Dean J

30
s == null

wird nicht funktionieren?


4
@ k38: Sie müssen "nur" verwenden, equals()wenn Sie Werte vergleichen möchten . Wenn Sie jedoch überprüfen möchten, ob eine Variable vorhanden ist null, verwenden Sie ==.
Felix Kling

18

Sicher funktioniert es. Sie verpassen einen wichtigen Teil des Codes. Sie müssen nur so vorgehen:

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

;)


23
Wenn Sie so weit gelesen haben, stellen Sie bitte fest, dass @aioobe Witze macht. du solltest es nicht so machen.
Dean J

12

Verwenden Sie die TextUtils-Methode, wenn Sie in Android arbeiten.

TextUtils.isEmpty (str) : Gibt true zurück, wenn der String null oder 0 lang ist. Parameter: str die zu untersuchende Zeichenfolge Rückgabe: true, wenn str null oder null ist

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

Unten finden Sie den Quellcode dieser Methode. Sie können direkt verwenden.

 /**
     * 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

Wenn wir uns die Implementierung der equalsIgnoreCase-Methode ansehen, finden wir diesen Teil:

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

Es wird also immer zurückgegeben, falsewenn das Argument lautet null. Und das ist offensichtlich richtig, denn der einzige Fall, in dem es zurückkehren sollte, trueist, wenn equalsIgnoreCase auf einem null String, aber aufgerufen wurde

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

wird definitiv zu einer NullPointerException führen.

Gleiche Methoden dienen also nicht dazu, zu testen, ob ein Objekt null ist, nur weil Sie sie nicht aufrufen können null.


4

Das sieht ein bisschen seltsam aus, aber ...

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

Es gab noch nie Probleme, dies auf diese Weise zu tun. Außerdem ist dies eine sicherere Möglichkeit, dies zu überprüfen und mögliche Nullpunktausnahmen zu vermeiden.


Vorsicht vor NullPointer In diesem Fall sollte die zweite Bedingung die erste sein.
Pawan

3

Ich bin mir nicht sicher, was mit der Antwort von The MYYN falsch war.

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

Die obige Nullprüfung ist in Ordnung.

Wenn Sie versuchen zu überprüfen, ob eine Zeichenfolgenreferenz einer anderen Zeichenfolge entspricht (Groß- und Kleinschreibung ignorieren), von der Sie wissen, dass sie keine Nullreferenz ist, gehen Sie wie folgt vor:

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

Wenn Zweifel bestehen, ob Sie für beide zu vergleichenden Zeichenfolgen Nullreferenzen haben oder nicht, müssen Sie mindestens eine auf Nullreferenz prüfen, um die Möglichkeit einer NullPointerException zu vermeiden.


2

Wenn Ihre Zeichenfolge den Wert "null" hat, können Sie verwenden

if(null == stringName){

  [code]

}

else

[Error Msg]

3
warum null == stringName und nicht stringName == null? Ich gehe davon aus, dass es keinen Unterschied gibt, aber warum dies bevorzugt wird (und ich habe es oft gesehen). Ich bevorzuge es, die Reihenfolge LTR zu lesen, also stringName == null, aber ich möchte wissen, was andere Leute denken.
Lukasz 'Severiaan' Grela

7
Normalerweise setzen Sie die Variable im Vergleich auf die rechte Seite, damit Sie die Variable nicht versehentlich initialisieren: null = stringName erzeugt einen Kompilierungsfehler, während stringName = null möglich wäre
Sarajog

4
Es ist überhaupt nicht "normal", dies zu tun, und viele Leute verbieten es ausdrücklich, da es für jemanden, der die Codebasis liest, natürlich nicht lesbar ist.
RichieHH

2

importiere es in deine Klasse

import org.apache.commons.lang.StringUtils;

Verwenden Sie es dann, beide geben true zurück

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

2

Sie können mit String == null überprüfen

Das funktioniert bei mir

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

1

Natürlich wird user351809 stringname.equalsignorecase(null)eine NullPointerException auslösen.
Sie haben ein Zeichenfolgenobjekt stringname, das zwei möglichen Bedingungen folgt: -

  1. stringnamehat einen Wert ungleich Null (z. B. "Computer"):
    Ihr Code funktioniert einwandfrei, da er die Form annimmt
    "computer".equalsignorecase(null)
    und Sie die erwartete Antwort als erhalten false.
  2. stringnamehat einen nullWert:
    Hier bleibt Ihr Code hängen, da er
    null.equalsignorecase(null)
    jedoch auf den ersten Blick gut erscheint und Sie hoffen können, dass die Antwort als true,
    aber nullkein Objekt ist, das die equalsignorecase()Methode ausführen kann .

Daher erhalten Sie die Ausnahme aufgrund von Fall 2.
Ich schlage vor, Sie verwenden einfachstringname == null


1

Einfache Methode:

public static boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

1

Wenn die valueRückgabe null ist, verwenden Sie:

if(value.isEmpty());

Irgendwann, um null zu überprüfen, gibt es if(value == null)in Java möglicherweise nicht true, selbst wenn der String null ist.


1
Die Verwendung von Scala (mit Java) if(value.isEmpty())gibt NullPointerException. In diesem Fall ist es besser mitif(value == null)
Andrea

Dies ist definitiv falsch, da es immer NPE auslöst, wenn es null ist.
Roger

1

Mit Java 7 können Sie verwenden

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

Dies wird zurückgegeben, truewenn beide Parameter sind null.


0

Mir ist klar, dass dies vor langer Zeit beantwortet wurde, aber ich habe dies noch nicht gesehen, also dachte ich, ich würde teilen, was ich tue. Dies ist nicht besonders gut für die Lesbarkeit von Code, aber wenn Sie eine Reihe von Nullprüfungen durchführen müssen, verwende ich gerne:

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

In diesem Beispiel wird trim für die Zeichenfolge aufgerufen, wodurch eine NPE ausgelöst wird, wenn die Zeichenfolge null oder Leerzeichen ist. In derselben Zeile können Sie jedoch nach null oder leer suchen, damit Sie nicht mit einer Tonne (mehr) enden ) schwer zu formatieren, wenn Blöcke.


Was meinst du mit Null oder Leer? Sie suchen hier nur nach Null. Das Leerzeichen ist eine der möglichen Rückgaben des "COND? A: B;" konstruieren, richtig?
Philo Vivero

0

Wenn ich es richtig verstehe, sollte es das tun:

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

-2

Nun, das letzte Mal, als jemand diese dumme Frage stellte, war die Antwort:

someString.equals("null")

Diese "Korrektur" verbirgt jedoch nur das größere Problem, wie es überhaupt nullwird "null".


Dies ist nicht der Fall - dies ist also keine Lösung und keine nützliche Antwort.
Chris Stratton

Ich möchte der Erste sein, der sagt: "wat"
philo vivero

Dies beantwortet nicht die Frage
Jason Adams

-2

Es gibt zwei Möglichkeiten, dies zu tun. Sagen Sie String == null oder 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);

    }

}

Überprüfen Sie dieses Beispiel. Hier ist ein weiteres Beispiel für eine Verknüpfungsversion von If Else.


1
Nein! .equals () darf nicht mit einem potenziell null Objekt verwendet werden, daher ist die einleitende Erklärung falsch. Und der Rest dieser Antwort scheint sinnlos und unabhängig von der gestellten Frage.
Chris Stratton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.