2012-06-13 16 views
17

wiem, że to nie jest możliwe, aby wywołać metodę equals na null obiektu tak:null.equals Java (object o)

//NOT WORKING 
      String s1 = null; 
      String s2 = null; 
      if(s1.equals(s2)) 
      { 
       System.out.println("NOT WORKING :'("); 
      } 

Ale w moim przypadku chcę porównać dwa obiekty z dwóch baz danych i ich dwa obiekty mogą mieć atrybuty wartość null ...

jaki jest więc sposób porównać dwa atrybuty, wiedząc, że nie ma pewności, że wartość jest null lub wypełnione.

Ta metoda jest dobra, czy nie?

//WORKING 
      String s1 = "test"; 
      String s2 = "test"; 
      if(s1 == s2 || s1.equals(s2)) 
      { 
       System.out.println("WORKING :)"); 
      } 

      //WORKING 
      String s1 = null; 
      String s2 = null; 
      if(s1 == s2 || s1.equals(s2)) 
      { 
       System.out.println("WORKING :)"); 
      } 

nie jestem pewien, bo w tym przypadku to nie działa ...:

//NOT WORKING 
      String s1 = null; 
      String s2 = null; 
      if(s1.equals(s2)|| s1 == s2 ) 
      { 
       System.out.println("NOT WORKING :'''("); 
      } 
+7

Po pierwsze, NIGDY nie porównywaj ciągów z "==" opeartorem, zawsze porównuj je za pomocą metody 'równa się (String inny znak)'. Operator "==" nie jest "wykonany" w celu porównania typów String. – Austin

+1

W moim przypadku robię ten przykład za pomocą String, ale nie porównuję String w rzeczywistości :) –

+2

Nie zakładaj, że twoje pytanie jest głupie. –

Odpowiedz

22

ja generalnie używać statycznego funkcję użytkową, że napisałem o nazwie equalsWithNulls aby rozwiązać ten problem :

class MyUtils { 
    public static final boolean equalsWithNulls(Object a, Object b) { 
    if (a==b) return true; 
    if ((a==null)||(b==null)) return false; 
    return a.equals(b); 
    } 
} 

Zastosowanie:

if (MyUtils.equalsWithNulls(s1,s2)) { 
    // do stuff 
} 

Zalety tej metody:

  • zawija złożoności pełnego testu równości w jednym wywołaniu funkcji. Myślę, że jest to znacznie lepsze niż osadzanie w testach kilku złożonych testów boolowskich za każdym razem, gdy to robisz. W rezultacie znacznie mniej prawdopodobne jest, że doprowadzi to do błędów.
  • Sprawia, że ​​kod jest bardziej opisowy, a przez to łatwiejszy do odczytania.
  • Przez wyraźne wskazanie wartości zerowych w nazwie metody, przekazujesz czytelnikowi, że powinni pamiętać, że jeden lub oba argumenty mogą być puste.
  • Najpierw przeprowadza się test (a == b) (optymalizacja, która pozwala uniknąć konieczności wywołania a).równa (b) w przypadku wspólnego dość, że A i B są niezerowe, ale odnoszą się do dokładnie tego samego obiektu)
+1

Dziękuję za rozwiązanie i wyjaśnienie. –

+0

naprawdę ładne podejście – ZaoTaoBao

+2

Należy zauważyć, że od Javy 7 ta metoda jest wbudowana: 'Objects.equals (obj1, obj2)' –

3

Powodem dostajesz NullPointerException, gdy robi s1.equals(s2) z s1 będąc null jest ponieważ nie s2 jest null, ale dlatego, że próbujesz wywołać metodę równości na s1, która jest zerowa.

Spróbuj zmienić go tak:

if(s1 != null && s1.equals(s2){ /*...*/ } 

Należy również pamiętać, że jeśli nie jest null s1 i s2 jest, dostaniesz false powrotem z równymi, ale nie NullPointerException.

20

Trzeba będzie sprawdzić conajmniej jeden nie jest null przed wykonaniem równa metoda -

if(s1 == s2 || (s1!=null && s1.equals(s2))) { 
    System.out.println("WORKING :)"); 
} 

tutaj s1==s2 zadziała okrywać null==null. Ale jeśli nawet jedna nie jest zerowa, to musisz sprawdzić co najmniej s1 przed wykonaniem równań.

Aktualizacja: edytowana przez @ „Bernard Paulus”, jeśli używasz Java 7, można użyć java.util.Objects.equals(Object, Object)

+0

Wycofano ze względu na zerowy scenariusz == null – egallardo

2
 String s1 = null; 
     String s2 = null; 

     if(s1 != null && s2 != null && s1.equals(s2)) { 
      System.out.println("equals"); 
     } else { 
      System.out.println("not equals"); 
     } 
2

Myślę, że porównanie dwóch obiektów.

Tak powinno być jak ten

if(s1==null & s2 == null) // both null but equal 
    return true; 
else if(s1 != null && s2 != null && s1.equals(s2)) // both not null and equal 
    return true; 
else 
    return false; 

True - na równi False - dla nie równy

1

Jeśli chcesz wiedzieć, czy coś jest „zerowy” można porównać przy użyciu:

if(s1==null) 

Jeśli jest pusta, powie Ci prawdę. Problem, jeśli masz łańcuch, który ma wartość null, nie możesz użyć metod equals(). Z tego powodu twoja trzecia część nie działa, ponieważ jeśli jest równa, nie możesz użyć wskaźnika pustego.

Powinieneś najpierw sprawdzić, czy obiekt jest pusty, a jeśli nie jest pusty, użyj metod równych.

Z drugiej strony bądź ostrożny, ponieważ może chcesz porównać pusty ciąg, w tym przypadku musisz użyć równości (""). Jeśli chcesz porównać pusty łańcuch, to lepiej, że można umieścić pierwszy pusty łańcuch na tej drodze:

"".equals(YourStringNotNull); 

Przepraszam za mój angielski mam nadzieję, że to pomaga.

4

Spróbuj użyć klasy ObjectUtils z org.apache.commons.lang

public static boolean equals(java.lang.Object object1, 
         java.lang.Object object2) 

Od docs api ...

Porównuje dwa obiekty dla równości, gdzie jeden lub oba obiekty mogą być NULL .

ObjectUtils.equals (null, zero) = TRUE

ObjectUtils.equals (null, "") = False

ObjectUtils.equals ("", zero) = False

ObjectUtils. odpowiada ("", "") = TRUE

ObjectUtils.equals (Boolean.TRUE, zero) = false

ObjectUtils.equals (Boolean.TRUE "prawda") = false

ObjectUtils.equals (Boolean.TRUE, Boolean.TRUE) = TRUE

ObjectUtils.equals (Boolean.TRUE, Boolean.FALSE) = False

0

Wywoływanie operatora kropki (metoda połączenia lub właściwości obiektów) na obiekcie zerowym będzie zawsze zawsze throw RuntimeException (Wyjątek są statyczne członków, ponieważ nie należą do obiektu, ale do klasy).

Fragment kodu działa tylko dlatego, że || jest operatorem skrót:

String s1 = null; 
String s2 = null; 
if(s1 == s2 || s1.equals(s2)) 

to nie ocenia prawą stronę jeśli lewa strona jest prawdą.

To samo dla & &: nie ocenia prawej strony, jeśli lewa strona jest fałszywa.

+0

Jeśli 's1' ma wartość null, a' s2' nie, nadal będziesz wykonywał ' s1.equals (s2) 'i uzyskaj wyjątek NullPointerException. – GKFX

7

Inną opcją do wykorzystania:

Objects.equals(identification, criteria.getIdentification()) 

java.util.Objects

Klasa ta składa się ze statycznych metod użytkowych działających na obiektów. Te narzędzia zawierają bezpieczne wartości null lub tolerowane wartości null do obliczania kodu skrótu obiektu, zwracania ciągu znaków dla obiektu i porównywania dwóch obiektów.

od: 1,7

public static boolean equals(Object a, Object b)

Zwraca true, jeśli argumenty są sobie równe i false inaczej. W związku z tym, jeśli oba argumenty są puste, zwracana jest wartość true i jeśli dokładnie jeden argument ma wartość NULL, zwracana jest wartość false. W innym przypadku równość jest określana za pomocą metody równości pierwszego argumentu o wartości .

Powiązane problemy