Jak sprawdzić ciąg przed null w java?


93

Jak mogę sprawdzić ciąg znaków pod kątem wartości null w Javie? ja używam

stringname.equalsignorecase(null)

ale to nie działa.

Odpowiedzi:


164

string == nullporównuje, czy obiekt ma wartość null. string.equals("foo")porównuje wartość wewnątrz tego obiektu. string == "foo"nie zawsze działa, ponieważ próbujesz sprawdzić, czy obiekty są takie same, a nie wartości, które reprezentują.


Dłuższa odpowiedź:

Jeśli spróbujesz tego, to nie zadziała, jak znalazłeś:

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

Powodem jest to, że foo jest null, więc nie wie, czym jest .equals; nie ma tam obiektu, z którego można by wywołać .equals.

Prawdopodobnie chciałeś:

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

Typowy sposób na zabezpieczenie się przed wartością zerową w przypadku ciągów to:

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

W ten sposób, jeśli foo było zerowe, nie ocenia drugiej połowy warunku i wszystko jest w porządku.

Prosty sposób, jeśli używasz literału typu String (zamiast zmiennej), to:

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

Jeśli chcesz to obejść, Apache Commons ma klasę - StringUtils - która zapewnia operacje na ciągach znaków null-bezpieczne.

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

Inna odpowiedź była żartem i powiedziała, że ​​powinieneś to zrobić:

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

Proszę, nie rób tego. Należy zgłaszać wyjątki tylko dla wyjątkowych błędów; jeśli oczekujesz wartości null, powinieneś sprawdzić ją z wyprzedzeniem i nie pozwolić jej zgłosić wyjątku.

W mojej głowie są ku temu dwa powody. Po pierwsze, wyjątki są powolne; sprawdzanie wartości null jest szybkie, ale gdy JVM zgłasza wyjątek, zajmuje dużo czasu. Po drugie, kod jest znacznie łatwiejszy do odczytania i utrzymania, jeśli po prostu wcześniej sprawdzisz wskaźnik zerowy.


2
przegapiłeś wersję Yody, działa również za każdym razem: if ("foo" .equalsIgnoreCase (string))
Omry Yadan

2
Ładne, pomocne wyjaśnienie. Dzięki za fajną grę.
james.garriss

@aioobe Myślę, że się zgadzamy? Jeśli możesz wyrazić się bardziej jasno, z przyjemnością edytuj.
Dean J

31
s == null

nie zadziała?


4
@ k38: Musisz użyć „tylko”, equals()jeśli chcesz porównać wartości . Ale jeśli chcesz sprawdzić, czy zmienna jest null, użyj ==.
Felix Kling

17

Jasne, że działa. Brakuje Ci istotnej części kodu. Musisz tylko zrobić w ten sposób:

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

;)


24
Jeśli przeczytałeś tak daleko, pamiętaj, że @aioobe żartuje; nie powinieneś tego robić w ten sposób.
Dean J

12

Użyj metody TextUtils, jeśli pracujesz w systemie Android.

TextUtils.isEmpty (str) : zwraca wartość true, jeśli ciąg ma długość null lub 0. Parametry: str łańcuch do zbadania Zwraca: prawda, jeśli str ma długość zerową lub zerową

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

Poniżej znajduje się kod źródłowy tej metody, możesz użyć 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

Jeśli spojrzymy na implementację metody equalsIgnoreCase, znajdziemy tę część:

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

Więc zawsze zwróci, falsejeśli argumentem jest null. I to oczywiście ma rację, ponieważ jedyny przypadek, w którym powinien zwrócić, trueto sytuacja, w której equalsIgnoreCase została wywołana na a null String, ale

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

z pewnością spowoduje wyjątek NullPointerException.

Zatem metody equals nie są przeznaczone do testowania, czy obiekt jest pusty, tylko dlatego, że nie można ich wywołać null.


4

Wygląda to trochę dziwnie, ale ...

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

Nigdy nie miałem żadnych problemów z robieniem tego w ten sposób, a ponadto jest to bezpieczniejszy sposób sprawdzania, unikając potencjalnych wyjątków od punktu zerowego.


uważaj na NullPointer w tym przypadku drugi warunek powinien być pierwszy.
Pawan,

3

Nie jestem pewien, co było nie tak z odpowiedzią MYYN.

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

Powyższe sprawdzenie zerowe jest całkiem w porządku.

Jeśli próbujesz sprawdzić, czy referencja typu String jest równa (ignorując wielkość liter) z innym ciągiem, o którym wiesz , że nie jest odwołaniem zerowym, zrób coś takiego:

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

Jeśli istnieje jakakolwiek wątpliwość co do tego, czy masz zerowe referencje dla obu porównywanych ciągów, musisz sprawdzić zerowe odwołanie do co najmniej jednego z nich, aby uniknąć możliwości wystąpienia NullPointerException.


2

Jeśli twój łańcuch ma wartość „null”, możesz użyć

if(null == stringName){

  [code]

}

else

[Error Msg]

3
dlaczego null == stringName a nie stringName == null? Zakładam, że nie ma różnicy, ale dlaczego jest to preferowane (i często to widziałem). Preferuję kolejność czytania LTR, więc stringName == null, ale chcę wiedzieć, co myślą inni ludzie.
Łukasz 'Severiaan' Grela

7
normalnie dla porównania umieszczasz zmienną po prawej stronie, aby nie zainicjować zmiennej przez pomyłkę: null = stringName powoduje błąd kompilacji, podczas gdy stringName = null byłoby możliwe
Sarajog

4
W ogóle nie jest to „normalne” i wiele osób wyraźnie tego zabrania, ponieważ nie jest to naturalnie czytelne dla kogoś czytającego kod.
RichieHH

2

zaimportuj go do swojej klasy

import org.apache.commons.lang.StringUtils;

następnie użyj go, oba zwrócą prawdę

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

2

Możesz sprawdzić za pomocą String == null

To działa dla mnie

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

1

Oczywiście user351809 stringname.equalsignorecase(null)zgłosi wyjątek NullPointerException.
Widzisz, masz obiekt typu string stringname, który spełnia 2 możliwe warunki: -

  1. stringnamema wartość niezerową (powiedzmy „komputer”):
    Twój kod będzie działał poprawnie, ponieważ przyjmuje postać,
    "computer".equalsignorecase(null)
    a oczekiwana odpowiedź jest wyświetlana jako false.
  2. stringnamema nullwartość:
    tutaj twój kod utknie, ponieważ
    null.equalsignorecase(null)
    wydaje się jednak dobry na pierwszy rzut oka i możesz mieć nadzieję, że odpowiedź true,
    ale nullnie jest obiektem, który może wykonać equalsignorecase()metodę.

W związku z tym otrzymujesz wyjątek ze względu na przypadek 2.
Proponuję po prostu użyćstringname == null


1

Prosta metoda:

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

1

Jeśli valuezwracana wartość ma wartość null, użyj:

if(value.isEmpty());

Czasami, aby sprawdzić null, if(value == null)w Javie może to nie dać prawdy, nawet jeśli String jest zerowy.


1
Używanie Scali (z Javą) if(value.isEmpty())daje NullPointerException. W tym przypadku lepiej jest używaćif(value == null)
Andrea

Jest to zdecydowanie niewłaściwe, ponieważ zawsze spowoduje zgłoszenie NPE, jeśli jest null.
Roger

1

W Javie 7 możesz używać

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

która zwróci, truejeśli oba parametry są null.


0

Zdaję sobie sprawę, że odpowiedź na to pytanie otrzymałem dawno temu, ale nie widziałem tego posta, więc pomyślałem, że podzielę się tym, co robię. Nie jest to szczególnie dobre dla czytelności kodu, ale jeśli musisz wykonać serię sprawdzeń zerowych, lubię używać:

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

W tym przykładzie trim jest wywoływany na łańcuchu, co spowodowałoby wyrzucenie NPE, gdyby łańcuch był pusty lub spacje, ale w tym samym wierszu można sprawdzić, czy nie ma wartości null lub pustej, aby nie uzyskać tony (więcej ) trudne do sformatowania, jeśli są blokami.


Co masz na myśli, sprawdzając, czy nie ma wartości null lub blank? Sprawdzasz tutaj tylko wartość null. Puste miejsce jest jednym z możliwych zwrotów "COND? A: B;" konstruować, prawda?
philo vivero

0

Jeśli dobrze rozumiem, powinno to zrobić:

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

-2

Cóż, ostatnim razem, gdy ktoś zadał to głupie pytanie, odpowiedź brzmiała:

someString.equals("null")

Ta „poprawka” ukrywa jednak tylko większy problem związany z tym, jak nullsię "null"pojawia.


Tak nie jest - więc to nie jest poprawka ani użyteczna odpowiedź.
Chris Stratton,

Chciałbym jako pierwszy powiedzieć: „wat”
philo vivero

to nie odpowiada na pytanie
jason adams

-2

Można to zrobić na dwa sposoby… Powiedz String == null lub 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);

    }

}

Sprawdź ten przykład ... Oto kolejny przykład skrótu wersji If Else ..


1
Nie! .equals () nie można używać z potencjalnie zerowym obiektem, więc wstępne wyjaśnienie jest błędne. A reszta tej odpowiedzi wydaje się bezcelowa i niezwiązana z zadanym pytaniem.
Chris Stratton,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.