Null Pointer-uitzondering in Java

Een NullPointerException in Java is een RuntimeException. Het treedt op wanneer een programma probeert een objectreferentie te gebruiken die de nulwaarde heeft. In Java is 'null' een speciale waarde die aan objectreferenties kan worden toegekend om de afwezigheid van een waarde aan te geven.

Redenen voor een nulaanwijzeruitzondering

Een NullPointerException treedt op vanwege de volgende redenen: 

  • Een methode aanroepen vanuit een nulobject.
  • Toegang krijgen tot of wijzigen van het veld van een nulobject.
  • De lengte van null nemen alsof het een array is.
  • Toegang krijgen tot of wijzigen van de slots van nulobjecten alsof het een array is.
  • Null gooien alsof het een werpbare waarde is.
  • Wanneer u probeert te synchroniseren via een nulobject.

Voorbeeld:

Java
   public     class   Geeks     {          public     static     void     main  (  String  []     args  )     {          // Reference set to null      String     s     =     null  ;             System  .  out  .  println  (  s  .  length  ());         }   }   

Uitgang:

 Hangup (SIGHUP)   
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)

Uitleg: In dit voorbeeld is de stringreferentie 's' nul. Wanneer het programma de methode length() probeert aan te roepen, genereert het een NullPointerException omdat er geen daadwerkelijk object is.

Waarom wordt null gebruikt in Java?

De nulwaarde dient als tijdelijke aanduiding en geeft aan dat er geen waarde is toegewezen aan een referentievariabele. Veel voorkomende toepassingen zijn onder meer:

  • Gekoppelde datastructuren : Het vertegenwoordigt het einde van een lijst of boomtak.
  • Ontwerppatronen : Dit wordt gebruikt in patronen zoals het Null Object Pattern of Singleton Pattern.

Hoe NullPointerException te vermijden

Om de NullPointerException te vermijden, moeten we ervoor zorgen dat alle objecten correct worden geïnitialiseerd voordat we ze gebruiken. Wanneer we een referentievariabele declareren, moeten we verifiëren dat het object niet nul is voordat we een methode of een veld van de objecten opvragen.

1. Letterlijke tekenreeksen gebruiken in equals()

Een veel voorkomend probleem betreft de vergelijking tussen een String-variabele en een letterlijke variabele. De letterlijke waarde kan een String zijn of een element van een Enum. In plaats van de methode aan te roepen vanuit het null-object, kunt u overwegen deze vanuit het letterlijke object aan te roepen. 

Voorbeeld:

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'  );      }      }   }   

Uitvoer
NullPointerException Caught 

We kunnen NullPointerException vermijden door gelijken aan te roepen op letterlijke waarden in plaats van op objecten.

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'  );      }      }   }   

Uitvoer
Not Same 

Opmerking : Roep altijd gelijken aan op de letterlijke waarde om te voorkomen dat een methode wordt aangeroepen op basis van een nulreferentie.

2. Methodeargumenten controleren

Voordat we de hoofdtekst van de nieuwe methode uitvoeren, moeten we eerst de argumenten ervan controleren op nulwaarden en pas doorgaan met de uitvoering van de methode als de argumenten correct zijn gecontroleerd. Anders genereert het een IllegalArgumentException en meldt het de aanroepende methode dat er iets mis is met de doorgegeven argumenten. 

Voorbeeld:

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  ();      }   }   

Uitvoer
0 13 IllegalArgumentException caught  

3. Gebruik de ternaire operator

De ternaire operator kan worden gebruikt om NullPointerException te vermijden. Eerst wordt de Booleaanse expressie geëvalueerd. Als de expressie waar is, wordt waarde1 geretourneerd, anders wordt waarde2 geretourneerd. We kunnen de ternaire operator gebruiken voor het afhandelen van nulaanwijzers.

Voorbeeld:

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  );      }   }   

Uitvoer
Geeks  

Uitleg : De ternaire operator helpt bij het controleren op null en voorkomt bewerkingen op null-referenties.

4. Optionele klasse gebruiken (Java 8+)

In Java 8 werd de optionele klasse geïntroduceerd als een containerobject dat al dan niet een niet-null-waarde kan bevatten. Het helpt voorkomen NullPointerException door te forceren om het geval expliciet af te handelen wanneer een waarde afwezig is.

Voorbeeld:

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      }   }   

Uitvoer
Default Name  

Uitleg: Optioneel.ofNullable(value) omhult de waarde die mogelijk null is. orElse() biedt een terugval als de waarde niet aanwezig is.