logo

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:



probeer catch block java
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.

opzet opzet

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. 

Java-thread maken

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:

volgorde op willekeurige sql
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.