Dziś pokażę Ci proste techniki uniknięcia wyjątku NullPointerException w Twoich aplikacjach. Są łatwe do naśladowania, ale znacznie poprawiają niezawodność i jakość Twojego kodu. Co więcej, z mojego doświadczenia wynika, że pierwsza wskazówka będzie miała zauważalny wpływ na jakość Twojego kodu. Jeśli znasz jakieś inne triki programistyczne w Javie, nie wahaj się podzielić nimi w komentarzach.
Używaj
Istnieje wiele bibliotek typu open source, które przejmują na siebie duży ciężar testowania platformy Staraj się nie wracać
To kolejna dobra wskazówka dotycząca programowania w języku Java, którą Joshua Bloch opisuje w swojej książce Java: Efektywne programowanie. Zwracając puste kolekcje lub tablice, upewnij się, że wywołanie metod podstawowych, takich jak
Wywołuj metody równości() i równościIgnoreCase() na znanym literale łańcuchowym, a nie na nieznanym obiekcie
Zawsze wywołuj metodęequals()
na znanym ciągu znaków, o którym wiesz, że nim nie jest null
. Metoda equals()
jest symetryczna, czyli wywołuje a.equals(b)
i b.equals(a)
daje ten sam wynik (jeśli a
i b
nie null
), dlatego wielu programistów nie zwraca uwagi na to, które obiekty są wywoływane equals()
, y a
czy y b
. Jednym z efektów ubocznych tego jest wyjątek NullPointerException, jeśli metoda zostanie wywołana null
.
Object unknownObject = null;
//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
To była najprostsza wskazówka dotycząca uniknięcia wyjątku NullPointerException, ale sama w sobie stanowi ogromną poprawę, ponieważ tę metodę equals()
można znaleźć wszędzie.
Wybierz wartość() zamiast toString() w przypadkach, gdy obie dają ten sam wynik
Ponieważ wywołanietoString()
referencji z wartością null
generuje wyjątek NullPointerException, lepiej jest używać wywoływania valueOf()
, gdy możemy uzyskać ten sam wynik, ponieważ wywoływanie valueOf()
z null
zwraca null
. Jest to szczególnie prawdziwe w przypadku klas opakowań , takich jak Integer
, lub . Float
Double
BigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
Skorzystaj z tych wskazówek, jeśli nie masz pewności, czy obiekt może istnieć null
, czy nie.
Używaj null
bezpiecznych metod i bibliotek
Istnieje wiele bibliotek typu open source, które przejmują na siebie duży ciężar testowania platformy null
. Jednym z najpopularniejszych jest StringUtils
Apache Commons. Używanie metod takich jak , StringUtils.isBlank()
itp . nie musisz się martwić o zgłoszenie wyjątku NullPointerException. isNumeric()
isWhiteSpace()
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
Wynik: prawda prawda fałsz fałsz A jednak przed użyciem nie zapomnij zapoznać się z dokumentacją null
bezpiecznych metod i klas. To kolejna z najlepszych sztuczek Java, która prowadzi do ogromnych ulepszeń bez większego wysiłku.
Staraj się nie wracać null
z metody, lepiej zwrócić pustą kolekcję
To kolejna dobra wskazówka dotycząca programowania w języku Java, którą Joshua Bloch opisuje w swojej książce Java: Efektywne programowanie. Zwracając puste kolekcje lub tablice, upewnij się, że wywołanie metod podstawowych, takich jak size()
lub length()
, nie powoduje zgłoszenia wyjątku NullPointerException. Klasa Collections
w szczególności deklaruje wygodne implementacje pustych list, zbiorów i słowników: Collections.EMPTY_LIST
, Collections.EMPTY_SET
i Collections.EMPTY_MAP
. Na przykład:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Podobnie możesz Collections.EMPTY_SET
go użyć Collections.EMPTY_MAP
zamiast zwracać null
.
Użyj adnotacji @NotNull i @Nullable
W opisie metod możesz zdefiniowaćnull
konwencje bezpieczeństwa metod, używając adnotacji @NotNull
i @Nullable, aby wskazać, czy metoda może zwrócić null
, czy nie. Nowoczesne kompilatory i środowiska IDE mogą używać tych adnotacji do analizowania kodu i udzielania odpowiednich porad, na przykład w sprawie pominięcia kontroli null
lub odwrotnie, w sprawie możliwości usunięcia niepotrzebnego sprawdzenia, które zatyka kod. Takie adnotacje są na przykład obsługiwane przez IntelliJ IDE i FindBugs i są również zawarte w JSR 305. Ale nawet jeśli twoje IDE nie obsługuje takich adnotacji, będą one same w sobie dobrą dokumentacją. Patrząc @NotNull
i @Nullable
programiście łatwiej będzie zrozumieć, gdzie dodać czek, null
a gdzie nie. Nawiasem mówiąc, jest to dość nowa praktyka wśród programistów Java i upłynie trochę czasu, zanim się rozpowszechni.
Unikaj niepotrzebnego autoboxingu i autounboxingu w swoim kodzie
Prowadzi to nie tylko do tworzenia niepotrzebnych obiektów tymczasowych, ale autoboxing może również zgłosić wyjątek NullPointerException, jeśli klasą opakowania jestnull
. Na przykład poniższy kod zgłosi wyjątek NullPointerException, jeśli wpis osoby nie zawiera numeru telefonu i zwróci wartość null
.
Person ram = new Person("ram");
int phone = ram.getPhone();
Podczas korzystania z autoboxingu lub autounboxingu nie tylko równości, ale także nierówności <
> >
mogą skutkować wyjątkiem NullPointerException.
Postępuj zgodnie z konwencjami i zdefiniuj rozsądne wartości domyślne.
Jednym z najlepszych sposobów uniknięcia wyjątku NullPointerException w Javie jest prawidłowe deklarowanie i przestrzeganie konwencji kodowania. Większość wyjątków NullPointerException ma miejsce, gdy próbujesz utworzyć obiekt bez wszystkich wymaganych danych i zależności. Zapobiegając tworzeniu niedokończonych obiektów poprzez łagodne odrzucanie takich żądań, uchronisz się przed dużą liczbą wyjątków NullPointerException w przyszłości. Podobnie, jeśli zezwolisz na tworzenie obiektów, powinieneś wybrać rozsądną wartość domyślną. Na przykład obiekt klasyEmployee
nie może zostać utworzony bez nazwy i id
, ale może nie zawierać numeru telefonu. W takim przypadku obiekty Employee
bez liczby mogą zamiast tego zwrócić zero null
. Chociaż takie zachowanie obiektu należy przemyśleć wcześniej - może łatwiej to sprawdzić null
niż zadzwonić na nieistniejący numer. W takim przypadku posiadanie dodatkowych warunków, które pola są, null
a które nie, pomoże w podjęciu właściwej decyzji. Ogólnie rzecz biorąc, wybór pomiędzy natychmiastowym zawieszeniem programu a null
jego przypisaniem jest ważną decyzją projektową i kiedy już dokonasz wyboru, musisz się jej konsekwentnie trzymać.
Ustaw ograniczenia na poziomie DBMS
Używając bazy danych do przechowywania obiektów programu, takich jak Klienci lub Zamówienia, mądrze jest określić „null
istość” obiektów na poziomie DBMS, stosując odpowiednie ograniczenia tabeli. Bazy danych często zawierają informacje z wielu źródeł, a wprowadzenie kontroli brakujących wartości poprawi integralność Twoich danych. Ponadto obecność kontroli null na poziomie DBMS zmniejszy je w kodzie Java: ładując dane z bazy danych do obiektów Java, możesz być pewien ich obecności i usunąć niepotrzebne „ != null
” z kodu programu.
Użyj wzorca obiektu zerowego
Tworzenie specjalnychNull
obiektów to kolejny sposób na uniknięcie wyjątku NullPointerExcpetion w Javie. Załóżmy, że jakaś metoda w naszej aplikacji zwraca obiekt, z którym program później pracuje, wywołując jego metody. Na przykład metoda Collection.iterator()
zwraca obiekt klasy Iterator
, który jest używany do iteracji po kolekcji. Następnie, jeśli oryginalny obiekt nie ma żadnego iteratora, null
możesz zamiast tego zwrócić specjalny Null
obiekt -obiekt, który ma metodę hasNext()
, która zawsze zwraca false
. To wszystko, drogi czytelniku, na tym kończę moje wskazówki dotyczące usuwania błędów NullPointerException z programów Java. Z pewnością docenisz, jak przydatne mogą być te proste i nieuciążliwe zasady. Dla przypomnienia, jeśli chcesz podzielić się innymi trikami NullPointerException w programach Java, możesz to zrobić w komentarzach. Przetłumaczone specjalnie dla studentów JavaRush. Oryginalny
GO TO FULL VERSION