Wyjątek NullPointerException w Javie jest wyjątkiem RuntimeException. Występuje, gdy program próbuje użyć odwołania do obiektu, które ma wartość null. W Javie „null” to specjalna wartość, którą można przypisać do odwołań do obiektów, aby wskazać brak wartości.
Przyczyny wyjątku wskaźnika zerowego
Wyjątek NullPointerException występuje z następujących powodów:
- Wywołanie metody z obiektu o wartości null.
- Dostęp lub modyfikowanie pola obiektu zerowego.
- Przyjmowanie długości null tak, jakby była tablicą.
- Dostęp do szczelin obiektów zerowych lub ich modyfikowanie tak, jakby były tablicą.
- Rzucanie wartości null tak, jakby była to wartość Throwable.
- Kiedy próbujesz zsynchronizować obiekt zerowy.
Przykład:
co to jest przesyłanie kataloguJava
public class Geeks { public static void main(String[] args) { // Reference set to null String s = null; System.out.println(s.length()); } }
Wyjście:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)
Wyjaśnienie: W tym przykładzie odwołanie w postaci ciągu „s” ma wartość null. Gdy program próbuje wywołać metodę długości(), zgłasza wyjątek NullPointerException, ponieważ nie ma rzeczywistego obiektu.
język maszyny
Dlaczego wartość null jest używana w Javie?
Wartość null służy jako symbol zastępczy i wskazuje, że do zmiennej referencyjnej nie jest przypisana żadna wartość. Typowe zastosowania obejmują:
- Połączone struktury danych : Reprezentuje koniec listy lub gałęzi drzewa.
- Wzorce projektowe : Jest to używane we wzorach takich jak wzorzec obiektu zerowego lub wzorzec Singleton.
Jak uniknąć wyjątku NullPointerException
Aby uniknąć wyjątku NullPointerException, musimy upewnić się, że wszystkie obiekty zostały poprawnie zainicjowane przed ich użyciem. Kiedy deklarujemy zmienną referencyjną, musimy sprawdzić, czy obiekt nie ma wartości null, zanim zażądamy metody lub pola z obiektów.
1. Używanie literałów łańcuchowych w funkcji równości()
Bardzo częstym problemem związanym z przypadkiem jest porównanie zmiennej typu String z literałem. Literał może być ciągiem znaków lub elementem wyliczenia. Zamiast wywoływać metodę z obiektu null, rozważ wywołanie jej z literału.
Przykład:
Javaimport java.io.*; class Geeks { public static void main (String[] args) { // Initializing String variable with null value String s = null; // Checking if s.equals null try { // This line of code throws NullPointerException because s is null if (s.equals('gfg')) System.out.print('Same'); else System.out.print('Not Same'); } catch(NullPointerException e) { System.out.print('NullPointerException Caught'); } } }
Wyjście
NullPointerException Caught
Możemy uniknąć wyjątku NullPointerException, wywołując funkcję równości na literale, a nie na obiekcie.
Javaimport java.io.*; class Geeks { public static void main (String[] args) { // Initializing String variable with null value String s = null; // Checking if s is null using try catch try { if ('gfg'.equals(s)) System.out.print('Same'); else System.out.print('Not Same'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Wyjście
Not Same
Notatka : Zawsze wywołuj równości w literale, aby uniknąć wywołania metody w odwołaniu o wartości null.
2. Sprawdzanie argumentów metod
Przed wykonaniem ciała nowej metody należy najpierw sprawdzić jej argumenty pod kątem wartości null i kontynuować wykonanie metody dopiero po poprawnym sprawdzeniu argumentów. W przeciwnym razie zgłosi wyjątek IllegalArgumentException i powiadomi metodę wywołującą, że coś jest nie tak z przekazanymi argumentami.
ciąg zastępczy Java
Przykład:
Javaimport java.io.*; class Geeks { public static void main(String[] args) { // String s set an empty string and calling getLength() String s = ''; try { System.out.println(getLength(s)); } catch (IllegalArgumentException e) { System.out.println( 'IllegalArgumentException caught'); } // String s set to a value and calling getLength() s = 'GeeksforGeeks'; try { System.out.println(getLength(s)); } catch (IllegalArgumentException e) { System.out.println( 'IllegalArgumentException caught'); } // Setting s as null and calling getLength() s = null; try { System.out.println(getLength(s)); } catch (IllegalArgumentException e) { System.out.println( 'IllegalArgumentException caught'); } } public static int getLength(String s) { if (s == null) throw new IllegalArgumentException( 'The argument cannot be null'); return s.length(); } }
Wyjście
0 13 IllegalArgumentException caught
3. Użyj operatora trójskładnikowego
Aby uniknąć wyjątku NullPointerException, można użyć operatora trójskładnikowego. Najpierw oceniane jest wyrażenie logiczne. Jeśli wyrażenie jest prawdziwe, zwracana jest wartość 1, w przeciwnym razie zwracana jest wartość 2. Możemy użyć operatora trójskładnikowego do obsługi wskaźników zerowych.
Przykład:
ciąg c w tablicyJava
import java.io.*; class Geeks { public static void main(String[] args) { String s = null; String m = (s == null) ? '' : s.substring(0 5); System.out.println(m); s = 'Geeksforgeeks'; m = (s == null) ? '' : s.substring(0 5); System.out.println(m); } }
Wyjście
Geeks
Wyjaśnienie : Operator trójskładnikowy pomaga sprawdzać wartość null i unikać operacji na referencjach zerowych.
4. Korzystanie z klasy opcjonalnej (Java 8+)
W Javie 8 klasa opcjonalna została wprowadzona jako obiekt kontenerowy, który może zawierać wartość różną od null lub nie. Pomaga uniknąć Wyjątek NullPointer wymuszając jawną obsługę przypadku, gdy nie ma wartości.
Przykład:
Javaimport java.util.Optional; public class OptionalExample { public static void main(String[] args) { Optional<String> name = Optional.ofNullable(null); // Safe way to access System.out.println(name.orElse('Default Name')); // prints: Default Name } }
Wyjście
Default Name
Wyjaśnienie: Option.ofNullable(value) zawija wartość, która może mieć wartość null. orElse() zapewnia rozwiązanie awaryjne, jeśli wartość nie jest obecna.