Chcę wykonać jakąś akcję TYLKO JEŻELI mój ciąg ma znaczącą wartość. Więc spróbowałem tego.
if (!myString.equals("")) {
doSomething
}
i to
if (!myString.equals(null)) {
doSomething
}
i to
if ( (!myString.equals("")) && (!myString.equals(null))) {
doSomething
}
i to
if ( (!myString.equals("")) && (myString!=null)) {
doSomething
}
i to
if ( myString.length()>0) {
doSomething
}
I we wszystkich przypadkach mój program doSomething
pomimo faktu, że mój ciąg JEST PUSTY. To jest równe null
. Więc co w tym złego?
DODANY:
Znalazłem przyczynę problemu. Zmienna została zadeklarowana jako łańcuch iw konsekwencji null
przypisana do tej zmiennej została przekształcona w "null"
! Więc if (!myString.equals("null"))
działa.
null
nie ma żadnych metod, więc też nieequals()
. Gdyby takmyString
byłonull
, jak mógłbyś kiedykolwiek wywołać na nim metodę? :)System.out.println(myString)
zrobił to bezpośrednio przed blokiem if, abyś mógł zobaczyć, co tam jest?null
”?null
przypisany do tej zmiennej został przekształcony w"null"
- to okropny pomysł. Spróbuj zmienić ten projekt, jeśli to w ogóle możliwe.Odpowiedzi:
Jako dalszy komentarz, powinieneś być świadomy tego terminu w
equals
umowie:Od
Object.equals(Object)
:Aby porównać z,
null
użyjx == null
ix != null
.Ponadto
x.field
ix.method()
rzucaNullPointerException
jeślix == null
.źródło
s.isEmpty()
zamiasts.length() == 0
dla czytelności. Każda różnica w wydajności jest nieistotna. Zgadzam się, żes.equals("")
to straszne.Jeśli
myString
taknull
, to wywołaniemyString.equals(null)
lubmyString.equals("")
zakończy się niepowodzeniem zNullPointerException
. Nie można wywołać żadnych metod instancji dla zmiennej o wartości null.Najpierw sprawdź, czy nie ma wartości null:
Wykorzystuje to ocenę zwarcia, aby nie próbować,
.equals
jeślimyString
nie przejdzie kontroli zerowej.źródło
.isEmpty()
zamiast.equals("")
.myString.isEmpty()
. Ale na tym poziomie czytelność jest ważniejsza od optymalizacji, a ludzie mogą być bardziej przyzwyczajeni do czytaniamyString.equals("")
. (A może nie.)Apache commons
StringUtils.isNotEmpty
to najlepsza droga.źródło
Jeśli myString jest w rzeczywistości null, to każde wywołanie odwołania zakończy się niepowodzeniem z wyjątkiem Null Pointer Exception (NPE). Od wersji java 6 używaj #isEmpty zamiast sprawdzania długości (w żadnym wypadku NIGDY nie twórz nowego pustego ciągu z czekiem).
Nawiasem mówiąc, jeśli porównujesz z literałami String, tak jak robisz, odwrócisz instrukcję, aby nie musieć mieć sprawdzenia null, tj.
zamiast :
źródło
PRACA !!!!
źródło
Musisz sprawdzić, czy
myString
obiekt jestnull
:źródło
Jeśli ciąg ma wartość null, wywołania takie jak to powinny zgłosić wyjątek NullReferenceException:
myString.equals (null)
W każdym razie myślę, że taka metoda jest tym, czego chcesz:
Następnie w swoim kodzie możesz wykonać następujące czynności:
źródło
Zachęcam do skorzystania z istniejącego narzędzia lub stworzenia własnej metody:
Następnie użyj go, gdy go potrzebujesz:
Jak wspomniano powyżej, || i && zwarcie operatorów. Oznacza to, że gdy tylko mogą określić swoją wartość, przestają. Więc jeśli (string == null) jest prawdziwe, część długości nie musi być oceniana, ponieważ wyrażenie zawsze byłoby prawdziwe. Podobnie z &&, gdzie jeśli lewa strona jest fałszywa, wyrażenie jest zawsze fałszywe i nie trzeba go dalej oceniać.
Jako dodatkowa uwaga, użycie length jest generalnie lepszym pomysłem niż użycie .equals. Wydajność jest nieco lepsza (niewiele) i nie wymaga tworzenia obiektów (chociaż większość kompilatorów może to zoptymalizować).
źródło
Próbować,
źródło
Nawiasem mówiąc, jeśli wykonujesz wiele operacji na ciągach, istnieje świetna klasa Spring z różnymi użytecznymi metodami:
http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/StringUtils.html
źródło
Za każdym razem, gdy mam do czynienia ze stringami (prawie za każdym razem), zatrzymuję się i zastanawiam się, który sposób jest naprawdę najszybszym sposobem sprawdzenia pustego łańcucha. Oczywiście sprawdzenie string.Length == 0 powinno być najszybsze, ponieważ Length jest właściwością i nie powinno być innego przetwarzania niż pobranie wartości właściwości. Ale potem zadaję sobie pytanie, dlaczego istnieje String.Empty? Powinno być szybsze sprawdzenie, czy nie ma String. Puste niż długość, mówię sobie. Cóż, w końcu postanowiłem to przetestować. Zakodowałem małą aplikację Windows Console, która mówi mi, ile czasu zajmuje wykonanie określonego sprawdzenia dla 10 milionów powtórzeń. Sprawdziłem 3 różne ciągi: ciąg NULL, ciąg pusty i ciąg „”. Użyłem 5 różnych metod: String.IsNullOrEmpty (), str == null, str == null || str == String.Empty, str == null || str == "", str == null || str.
Zgodnie z tymi wynikami wyszukiwanie jest średnio
str == null
najszybsze, ale może nie zawsze przynosić to, czego szukamy.if str = String.Empty
lubstr = ""
skutkuje fałszem. Następnie masz 2 remisujące na drugim miejscu:String.IsNullOrEmpty()
istr == null || str.length == 0
. PonieważString.IsNullOrEmpty()
wygląda ładniej i jest łatwiejszy (i szybszy) do napisania, polecam użycie go zamiast innego rozwiązania.źródło
Zrobiłbym coś takiego:
źródło
Używałem
StringUtil.isBlank(string)
Sprawdza, czy łańcuch jest pusty: null, emtpy lub tylko białe znaki.
Więc ten jest jak dotąd najlepszy
Oto oryginalna metoda z dokumentacji
źródło
To powinno działać:
Jeśli nie, to myString prawdopodobnie ma wartość, której się nie spodziewasz. Spróbuj wydrukować to w następujący sposób:
Użycie symboli „+” do otaczania ciągu pokaże ci, czy jest tam dodatkowa spacja, której nie bierzesz pod uwagę.
źródło
if(str.isEmpty() || str==null){ do whatever you want }
źródło
OK, tak działają typy danych w Javie. (Musisz wybaczyć mój angielski, prawdopodobnie nie używam właściwego słownictwa. Musisz rozróżnić dwa z nich. Podstawowe typy danych i normalne typy danych. Podstawowe typy danych w zasadzie składają się na wszystko, co istnieje. Na przykład to wszystkie liczby, znaki, wartości logiczne itp. Reszta to zwykłe lub złożone typy danych. Łańcuch to tablica znaków, a zatem złożony typ danych.
Każda utworzona zmienna jest w rzeczywistości wskaźnikiem wartości w Twojej pamięci. Na przykład:
zmienna „s” NIE zawiera łańcucha. To jest wskaźnik. Ten wskaźnik wskazuje na zmienną w twojej pamięci. Kiedy wywołujesz
System.out.println(anyObject)
, wywoływana jesttoString()
metoda tego obiektu. Jeśli nie nadpisałtoString
z Object, wydrukuje wskaźnik. Na przykład:Wszystko za „@” to wskaźnik. Działa to tylko w przypadku złożonych typów danych. Prymitywne typy danych są BEZPOŚREDNIO zapisywane we wskaźnikach. W rzeczywistości nie ma wskaźnika, a wartości są przechowywane bezpośrednio.
Na przykład:
W tym przypadku NIE przechowuję wskaźnika. będę przechowywać wartość całkowitą 123 (w bajtach ofc).
Ok, więc wróćmy do
==
operatora. Zawsze porównuje wskaźnik, a nie zawartość zapisaną w miejscu wskaźnika w pamięci.Przykład:
To oba String mają inny wskaźnik. Jednak String.equals (String other) porównuje zawartość. Możesz porównać pierwotne typy danych za pomocą operatora „==”, ponieważ wskaźnik dwóch różnych obiektów o tej samej zawartości jest równy.
Null oznaczałoby, że wskaźnik jest pusty. Domyślnym pustym typem danych pierwotnych jest 0 (dla liczb). Jednak wartość Null dla dowolnego obiektu złożonego oznacza, że obiekt ten nie istnieje.
Pozdrowienia
źródło
Dla mnie najlepszym sposobem sprawdzenia, czy łańcuch ma jakąkolwiek sensowną zawartość w Javie, jest to:
Najpierw sprawdzasz, czy łańcuch należy
null
unikać,NullPointerException
a następnie przycinasz wszystkie znaki spacji, aby uniknąć sprawdzania łańcuchów, które mają tylko białe spacje, a na końcu sprawdzasz, czy przycięty ciąg nie jest pusty, tj. Ma długość 0.źródło
Miałem ten problem w Androidzie i używam tego sposobu (Pracuj dla mnie):
Ale w kodzie java używam:
I :
źródło
Wolę używać:
Przeczytaj StringUtils.isBlank () vs String.isEmpty () .
źródło
W Androidzie możesz to sprawdzić za pomocą metody narzędziowej
isEmpty
zTextUtils
,isEmpty(CharSequence str)
Metoda sprawdza zarówno warunek, jaknull
i długość.źródło
Zawsze używam w ten sposób:
lub możesz skopiować to do swojego projektu:
i nazwij to tak:
zwróci wartość true, jeśli jest pusta lub null.
b=true
jeśli jest pusty lub zerowylub możesz użyć try catch and catch, gdy jest zerowy.
źródło
Myślę, że myString nie jest ciągiem, ale tablicą ciągów. Oto, co musisz zrobić:
źródło
Możesz sprawdzić ciąg równy null za pomocą tego:
Jeśli wynikiem jest 0, to (Test + „”) = „null”.
źródło
Wypróbowałem większość przykładów podanych powyżej dla wartości null w aplikacji na Androida, którą budowałem i WSZYSTKO NIE POWIODŁO SIĘ. Więc wymyśliłem rozwiązanie, które zawsze działało dla mnie.
Więc po prostu połącz pusty ciąg, tak jak zrobiłem powyżej, i przetestuj pod kątem „null” i działa dobrze. W rzeczywistości nie jest zgłaszany żaden wyjątek
źródło
Wyjątek może również pomóc:
źródło
Jeśli pracujesz w systemie Android, możesz użyć prostej klasy TextUtils. Sprawdź poniższy kod:
To jest proste użycie kodu. Odpowiedź można powtórzyć. Ale łatwo jest mieć jedno i proste sprawdzenie dla Ciebie.
źródło
Musisz sprawdzić z null
if(str != null).
źródło