what is nullpointerexception java how avoid it
Ten samouczek zawiera wyjaśnienia dotyczące wyjątku NullPointerException w języku Java. Omówimy przyczyny wyjątku zerowego wskaźnika i sposoby jego uniknięcia:
Wyjątek NullPointerException w Javie jest wyjątkiem w czasie wykonywania. Java przypisuje specjalną wartość null do odwołania do obiektu. Gdy program próbuje użyć odwołania do obiektu ustawionego na wartość null, zgłaszany jest ten wyjątek.
=> Obejrzyj serię prostych szkoleń dotyczących języka Java.
Czego się nauczysz:
NullPointerException w Javie
Jeśli odwołanie do obiektu z wartością null zgłasza wyjątek NullPointerException, to dlaczego potrzebujemy wartości null?
Wartość null jest zwykle używana do wskazania, że żadna wartość nie została przypisana do zmiennej odniesienia. Po drugie, potrzebujemy wartości null dla kolekcji, takich jak połączone listy i drzewa, aby wskazać puste węzły. Wzorce projektowe, takie jak wzorce singleton, używają wartości null.
Podsumowując, wartość null w Javie ma wiele zastosowań. Wyjątek zerowego wskaźnika jest generowany w określonych scenariuszach w języku Java.
Niektóre scenariusze są następujące:
- Metoda została wywołana przy użyciu obiektu o wartości null.
- Uzyskiwanie dostępu lub modyfikowanie pola lub elementu członkowskiego danych obiektu zerowego.
- Przekazywanie obiektu o wartości null jako argumentu do metody.
- Obliczanie długości tablicy zerowej.
- Dostęp do indeksu tablicy null.
- Synchronizacja pustego obiektu.
- Zgłaszanie pustego obiektu.
Wyjątek Null Pointer pochodzi z klasy RuntimeException.
Hierarchię wyjątków NullPointerException podano poniżej.
Jak pokazano na powyższej hierarchii, wyjątek o wartości Null Pointer pochodzi od RuntimeException, który dziedziczy klasę Exception. Klasa wyjątku z kolei wywodzi się z klasy Throwable, która jest podklasą Object.
Przyczyny wystąpienia wyjątku java.lang.NullPointerException
Teraz pokażemy każdy ze scenariuszy wystąpienia NullPointerException, które wymieniliśmy powyżej.
# 1) Metoda jest wywoływana przy użyciu obiektu o wartości null
Rozważmy następujący przykład kodu. Tutaj mamy klasę MyClass, która udostępnia dwie metody. Pierwsza metoda „initT” zwraca obiekt pusty. W metodzie main tworzymy obiekt MyClass z wywołaniem metody initT.
Następnie wywołujemy metodę drukowania MyClass. W tym przypadku wyjątek java.lang.NullPointerException jest generowany, gdy wywołujemy metodę print przy użyciu obiektu o wartości null.
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
Wynik
# 2) Pole dostępu do obiektu zerowego
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
Wynik
jak wydrukować zawartość tablicy java
To kolejna przyczyna wyjątku NullPointerException. Tutaj próbujemy uzyskać dostęp do elementu członkowskiego klasy przy użyciu obiektu null. Przypisujemy wartość zwracaną przez metodę initT do obiektu t, a następnie uzyskujemy dostęp do numField za pomocą obiektu t. Ale obiekt t jest obiektem zerowym, ponieważ initT zwraca obiekt pusty. W tym momencie zostaje zgłoszony wyjątek java.lang.NullPointerException.
# 3) Przekazanie pustego obiektu jako argumentu
Jest to częsta przyczyna wystąpienia wyjątku java.lang.NullPointerException. Rozważmy następujący program Java. Mamy tutaj metodę „print_LowerCase”, która konwertuje obiekt String przekazany jako argument na małe litery.
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String() args) { print_LowerCase(null); //pass null object as argument to the method } }
Wynik
W metodzie main wywołujemy tę metodę i przekazujemy jako argument wartość null. Ponieważ obiekt String nie może mieć wartości null, generowany jest wyjątek java.lang.NullPointerException.
# 4) Pobranie długości tablicy zerowej
Próba obliczenia długości tablicy pustej również powoduje zgłoszenie wyjątku java.lang.NullPointerException.
Pokazuje to poniższy program.
public class Main { public static void main(String() args) { int() dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
Wynik
W powyższym programie deklarujemy tablicę i przypisujemy do niej null, czyli brak danych. Kiedy używamy właściwości length w tej tablicy o wartości null, generowany jest wyjątek NullPointerException.
# 5) Indeks dostępu do tablicy zerowej
Podobnie jak w przypadku length, nawet jeśli próbujemy uzyskać dostęp do wartości w tablicy null za pomocą indeksu, jest to przyczyną wystąpienia wyjątku java.lang.NullPointerException.
public class Main { public static void main(String() args) { int() dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray(2)); } }
Wynik
W powyższym programie próbujemy uzyskać dostęp do wartości pod indeksem 2 tablicy pustej.
# 6) Synchronizacja na pustym obiekcie
Zazwyczaj synchronizujemy blok lub metodę, aby ułatwić jednoczesny dostęp. Jednak odwołanie do obiektu, którego używamy do synchronizacji, nie powinno mieć wartości NULL. Jeśli jest to obiekt zerowy, wynikiem jest wyjątek java.lang.NullPointerException.
Pokazuje to poniższy program w języku Java. Jak widać, mamy obiekt typu „mutex” typu String zainicjowany na wartość null. Następnie w funkcji głównej używamy zsynchronizowanego bloku z muteksem jako odniesieniem do obiektu. Ponieważ mutex ma wartość null, zostaje zgłoszony wyjątek java.lang.NullPointerException.
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String() args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
Wynik
# 7) Rzucając null
public class Main { public static void main(String() args) { throw null; //throw null } }
Wynik:
W powyższym przykładowym programie, zamiast rzucać prawidłowy obiekt, wyrzucany jest null. Powoduje to wyjątek zerowego wskaźnika.
Unikanie wyjątku zerowego wskaźnika
Teraz, gdy poznaliśmy przyczyny wystąpienia wyjątku NullPointerException, musimy również spróbować tego uniknąć w naszym programie.
Po pierwsze, musimy upewnić się, że obiekty, których używamy w naszych programach, zostały poprawnie zainicjowane, abyśmy mogli uniknąć używania obiektów zerowych, które powodują wyjątek wskaźnika zerowego. Powinniśmy również uważać, aby zmienne referencyjne używane w programie wskazywały prawidłowe wartości i nie otrzymywały przypadkowo wartości null.
Oprócz tych rozważań możemy również zachować większą ostrożność w poszczególnych przypadkach, aby uniknąć wyjątku java.lang.NullPointerException.
Poniżej rozważymy kilka przypadków.
# 1) Porównanie ciągów z literałami
Porównanie zmiennej łańcuchowej z literałem (rzeczywistą wartością lub elementem wyliczenia) jest bardzo częstą operacją w programach Java. Ale jeśli zmienna String, która jest obiektem, ma wartość null, porównanie tego pustego obiektu z literałami spowoduje zgłoszenie wyjątku NullPointerException.
Rozwiązaniem jest więc wywołanie metody porównania z literału zamiast obiektu String, który może mieć wartość null.
Poniższy program pokazuje, jak możemy wywołać metody porównawcze z literałów i uniknąć java.lang.NullPointerException.
class Main { public static void main (String() args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Wynik
# 2) Sprawdź argumenty metody
Sprawdź argumenty metody, aby upewnić się, że nie są to wartości null. Jeśli argumenty nie są zgodne ze specyfikacją, kod zgłosi wyjątek IllegalArgumentException, aby wskazać, że argumenty nie są zgodne z oczekiwaniami.
Jest to pokazane w poniższym programie Java.
import java.io.*; class Main { public static void main (String() args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
Wynik
# 3) Użycie operatora trójargumentowego do obsługi wartości null
Możemy użyć operatora trójargumentowego, aby uniknąć wyjątku java.lang.NullPointerException. Operator trójskładnikowy ma trzech operatorów. Pierwsza to wyrażenie boolowskie, którego wynikiem jest prawda lub fałsz. Jeśli wyrażenie jest prawdziwe, zwracany jest drugi operator lub trzeci operator.
Poniższy program przedstawia użycie operatora trójargumentowego w celu uniknięcia wyjątku NullPointerException.
import java.io.*; class Main { public static void main (String() args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
Wynik
Często Zadawane Pytania
Pytanie 1) Jak naprawić wyjątek NullPointerException w Javie?
Odpowiedź: Musimy upewnić się, że wszystkie obiekty używane w programie są poprawnie zainicjowane i nie mają wartości null. Ponadto zmienne odniesienia nie powinny mieć wartości null.
# 2) Czy NullPointerException jest zaznaczony czy niezaznaczony?
Odpowiedź: NullPointerException nie jest sprawdzonym wyjątkiem. Jest potomkiem RuntimeException i nie jest zaznaczona.
# 3) Jak zatrzymać NullPointerException?
Odpowiedź: Oto niektóre z najlepszych rozwiązań pozwalających uniknąć wyjątku NullPointerException:
- Użyj metody equals () i equalsIgnoreCase () z literałem String zamiast używać go na nieznanym obiekcie, który może mieć wartość null.
- Użyj valueOf () zamiast toString (); i oba zwracają ten sam wynik.
- Użyj adnotacji Java @NotNull i @Nullable.
# 4) Jaka jest wartość null w Javie?
Odpowiedź: Wartość null nie odnosi się do żadnego obiektu ani zmiennej. To słowo kluczowe i literał. Reprezentuje zerowe odniesienie.
# 5) Czy możemy złapać wyjątek NullPointerException w Javie?
Odpowiedź: Wyjątek java.lang.NullPointerException jest niesprawdzonym wyjątkiem i rozszerza klasę RuntimeException. Dlatego nie ma przymusu, aby programista go złapał.
Wniosek
W tym samouczku omówiliśmy wyjątek NullPointerException w języku Java. Jest to dość niebezpieczny wyjątek i zwykle pojawia się, gdy najmniej się tego spodziewamy. Wyjątek zerowego wskaźnika występuje głównie z powodu pustego obiektu lub zerowego odwołania. Widzieliśmy już przyczyny i sposoby uniknięcia wyjątku NullPointerException.
O ile to możliwe, programista powinien starać się unikać wystąpienia w programie wyjątku zerowego wskaźnika. Ponieważ jest to niezaznaczony wyjątek czasu wykonywania, powinniśmy zauważyć, że nie występuje, gdy aplikacja jest uruchomiona.
=> Odwiedź tutaj, aby nauczyć się języka Java od podstaw.
rekomendowane lektury
- Wyjątki Java i obsługa wyjątków z przykładami
- Jak obsługiwać wyjątek ArrayIndexOutOfBoundsException w języku Java?
- C # samouczek obsługi wyjątków z przykładami kodu
- Kompletny przewodnik po obsłudze wyjątków PL SQL z przykładami
- Jak obsługiwać wyjątki w skryptach SoapUI Groovy - samouczek SoapUI nr 11
- Python Try Except - Wyjątek obsługi języka Python z przykładami
- Obsługa wyjątków JDBC - jak obsługiwać wyjątki SQL
- Obsługa wyjątków w C ++