Wyjątek wskaźnika zerowego w Javie

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:

Java
   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.

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:

Java
   import     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.

Java
   import     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. 

Przykład:

Java
   import     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:

Java
   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:

Java
   import     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.