JavaRush /Blog Java /Random-PL /Sztuczki i wskazówki. Jak uniknąć wyjątku NullPointerExce...
DarthVictor
Poziom 28

Sztuczki i wskazówki. Jak uniknąć wyjątku NullPointerException w aplikacjach Java

Opublikowano w grupie Random-PL
Sztuczki i porady.  Jak uniknąć wyjątku NullPointerException w aplikacjach Java — 1Dziś 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. Sztuczki i porady.  Jak uniknąć wyjątku NullPointerException w aplikacjach Java — 2

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 ai bnie null), dlatego wielu programistów nie zwraca uwagi na to, które obiekty są wywoływane equals(), y aczy 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łanie toString()referencji z wartością nullgeneruje wyjątek NullPointerException, lepiej jest używać wywoływania valueOf(), gdy możemy uzyskać ten sam wynik, ponieważ wywoływanie valueOf()z nullzwraca null. Jest to szczególnie prawdziwe w przypadku klas opakowań , takich jak Integer, lub . FloatDoubleBigDecimal
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 nullbezpiecznych 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 StringUtilsApache 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ą nullbezpiecznych metod i klas. To kolejna z najlepszych sztuczek Java, która prowadzi do ogromnych ulepszeń bez większego wysiłku.

Staraj się nie wracać nullz 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 Collectionsw szczególności deklaruje wygodne implementacje pustych list, zbiorów i słowników: Collections.EMPTY_LIST, Collections.EMPTY_SETi Collections.EMPTY_MAP. Na przykład:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
Podobnie możesz Collections.EMPTY_SETgo użyć Collections.EMPTY_MAPzamiast zwracać null.

Użyj adnotacji @NotNull i @Nullable

W opisie metod możesz zdefiniować nullkonwencje bezpieczeństwa metod, używając adnotacji @NotNulli @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 nulllub 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 @NotNulli @Nullableprogramiście łatwiej będzie zrozumieć, gdzie dodać czek, nulla 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 jest null. 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 klasy Employeenie może zostać utworzony bez nazwy i id, ale może nie zawierać numeru telefonu. W takim przypadku obiekty Employeebez liczby mogą zamiast tego zwrócić zero null. Chociaż takie zachowanie obiektu należy przemyśleć wcześniej - może łatwiej to sprawdzić nullniż zadzwonić na nieistniejący numer. W takim przypadku posiadanie dodatkowych warunków, które pola są, nulla 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 nulljego 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ć „ nullistość” 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 specjalnych Nullobiektó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, nullmożesz zamiast tego zwrócić specjalny Nullobiekt -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
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION