2012-08-26 10 views
19

W tym kodzie.Jak sprawdzić wartość pustą w java

public class Test { 
    public static void testFun(String str) { 
     if (str == null | str.length() == 0) { 
      System.out.println("String is empty"); 
     } else { 
      System.out.println("String is not empty"); 
     } 
    } 
    public static void main(String [] args) { 
     testFun(null); 
    } 
} 

Przekazujemy wartość zerową do funkcji testFun. Kompiluje się dobrze, ale daje w środowisku wykonawczym nullPointerException.

Załóżmy, że wartość rzeczywistego argumentu przekazywanego do testFun jest generowana z jakiegoś procesu. Załóżmy, że omyłkowo zwracana jest wartość pusta i jest ona przekazywana do testFun. Jeśli tak, to w jaki sposób motyka potwierdza, że ​​wartość przekazana do funkcji jest równa zeru, czy nie?

Jednym (dziwnym) rozwiązaniem może być przypisanie formalnego parametru do pewnej zmiennej wewnątrz funkcji, a następnie przetestowanie jej. Ale jeśli do funkcji zostanie przekazanych wiele zmiennych, może to być nudne i niewykonalne. Jak sprawdzić wartości puste w takim scenariuszu?

Edytuj: Przez pomyłkę napisałem || zamiast | w warunku if. Wyjątek czasu wykonywania jest teraz generowany

+0

zapoznaj się zmienił. – Shades88

+1

Czy zapomniałeś przekompilować? [Dla mnie nie powstaje "NullPointerException"] (http://ideone.com/pRrB3). – oldrinb

Odpowiedz

38

Ta zmiana pokazuje dokładnie różnicę między kodu, który działa i kod, który nie.

Kontrola ta zawsze ocenia zarówno warunków, rzuca wyjątek, jeśli str jest zerowy:

if (str == null | str.length() == 0) { 

niniejsza (używając || zamiast |) jest zwierania - jeśli pierwszy warunek ocenia na true, drugi nie jest oceniany.

Zobacz section 15.24 w JLS, aby uzyskać opis || i section 15.22.2 dla binarnego |. Wstępne wprowadzenie do sekcji 15.24 jest jednak ważne:

Operator warunkowy lub operator || operator jest jak | (§ 15.22.2), ale ocenia swój prawy operand tylko wtedy, gdy wartość jego lewego argumentu jest fałszywa.

+4

475K !!! (Bow ..) – Shades88

+3

@ Shades88 869k i liczenie :) –

+2

@AndrasDeak Latanie w kierunku miliona O_o – 8bitcartridge

3

Problem polega na tym, że w twoim kodzie program wywołuje 'null.length()', który nie jest zdefiniowany, jeśli argument przekazany do funkcji ma wartość null. Właśnie dlatego wyrzucany jest wyjątek.

+2

Nigdy nie dociera do tej części 'if' jeśli' str == null'. – Keppil

+2

w warstwie if (str == null || str.length() == 0) druga część nigdy nie byłaby oceniana, jeśli pierwsza jest fałszywa. Jeśli chcesz, aby druga część była oceniana, napiszesz ją tak, jakby (str == null | str.length() == 0), abyś mógł uzyskać wskaźnik nullpointer. Nie rozumiem, dlaczego chciałbyś w tym przypadku, ale w niektórych przypadkach może to być korzystne. –

+1

faktycznie tak. || jest leniwy, ale używa | który oceni obie strony: –

2

Można użyć StringUtils:

import org.apache.commons.lang3.StringUtils; 

if (StringUtils.isBlank(str)) { 

System.out.println("String is empty"); 

} else { 

System.out.println("String is not empty"); 

} 

Sprawdźcie tutaj także: StringUtils.isBlank() vs String.isEmpty()

isBlank przykłady:

StringUtils.isBlank(null)  = true 
StringUtils.isBlank("")  = true 
StringUtils.isBlank(" ")  = true 
StringUtils.isBlank("bob")  = false 
StringUtils.isBlank(" bob ") = false 
Powiązane problemy