Chyba jednym z bardziej frustrujących błędów jakie zostają nam rzucone jest NullPointerException
. Za każdym razem gdy NPE się pojawia, zastanawiam się jakim cudem dany obiekt mógł być nullem. Zwłaszcza, gdy coś jest tak oczywista jak String name
w klasie Person
. Niestety często chcąc dokonać szybkich zmian odpuszczamy przeanalizowanie wszystkich możliwych przypadków i potem otrzymujemy niemiłą niespodziankę. Pokażę wam jeden prosty sposób jak unikać NPE, który wydaje się oczywisty, ale jednak czasem zdarza się – celowo lub nie – zapomnieć o tym rozwiązaniu.
Wywołanie metody na Stringu, który jest nullem
Pewnie wiele razy zdarzyło wam się wywołać metodę equals()
. Tak samo jak wiele razy mieliście coś porównać w takiej sytuacji, w której nie miała znaczenia kolejność obiektów. Bo przecież equals()
powinno zwrócić taki sam wynik, jeżeli porównujemy obiekt a
do b
, jak i b
do a
. Tylko czy na pewno nie ma to znaczenia? Pewnie już wiecie o co chodzi.
String a = "";
String b = null;
System.out.println(a.equals(b));
System.out.println(b.equals(a));
Czy tzw. pusty string jest tym samym co null
. Oczywiście nie, ale tylko pierwsze wywołanie metody equals()
pozwoli się o tym przekonać. Za drugim zostanie wyrzucony NullPointerException
. To, na którym obiekcie wywołamy metodę, a który umieścimy jako argument metody ma czasem kolosalne znaczenie. I tak spójrzcie jeszcze na ten przykład, może trochę karkołomny, lecz pytanie brzmi które wywołanie metody compareTo() na pewno uchroni nas przed NPE?
Person personA = getPersonFromPesel(81010128282L);
Person personB = new Person(82310123232L);
int isAOlder = personA.compareTo(personB);
int isBOlder = personB.compareTo(personA);
W tym przypadku mamy pewność, że personB
nie jest nullem, gdyż jest tworzony nowy obiekt. Można więc bezpiecznie wywołać metodę compareTo()
. Natomiast nie jesteśmy pewni co zwróci metoda getPersonFromPesel()
i czy nie będzie to null. Chcąc więc uzyskać porównanie metodą compareTo()
lepiej wykorzystać ten drugi wariant i w miarę potrzeb odwrócić wynik.
To taki mały tip, który mam nadzieję, że czasem się przyda w codziennym juniorskim programowaniu.