logo

Null Pointer-uitzondering in Java

In deze zelfstudie gaan we de Null pointer-uitzondering in Java leren. Null pointer-uitzondering is een runtime-uitzondering. Null is een speciaal soort waarde die kan worden toegewezen aan de referentie van een object. Telkens wanneer iemand een verwijzing probeert te gebruiken die de waarde Null heeft, wordt de NullPointerException gegenereerd.

Verschillende scenario's voor de Null Pointer-uitzondering

Bekijk enkele van de volgende scenario's waarin NullPointerException kan worden gegenereerd.

  • Het berekenen van de grootte of lengte van de Null alsof het een reeks elementen is.

Bestandsnaam: ThrowNullExcep.java

 public class ThrowNullExcep { // main method public static void main(String args[]) { int arr[] = null; // array is assigned a null value System.out.println('The length of the array arr is: ' + arr.length); } } 

Uitgang:

tekenreeks int
Uitzondering in thread 'main' java.lang.NullPointerException: Kan de arraylengte niet lezen omdat '' nul is bij ThrowNullExcep.main(ThrowNullExcep.java:7)
  • Een methode aanroepen met behulp van het object dat de waarde Null heeft.

Bestandsnaam: ThrowNullExcep1.java

 public class ThrowNullExcep1 { public void foo() { System.out.println('In the method foo.'); } public static void main(String args[]) { ThrowNullExcep1 obj = null; // assigning null value // invoking the method foo() obj.foo(); } } 

Uitgang:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Wanneer u probeert te synchroniseren via een NULL-object.

Bestandsnaam: ThrowNullExcep2.java

 // A Java program that synchronizes over a NULL object. import java.util.*; import java.io.*; // A Class that is required for sending the message class Sendr { public void sendMethod(String mssg) { System.out.println('Sending message: ' + mssg ); try { Thread.sleep(100); } catch (Exception exp) { System.out.println('Thread interrupted.' + exp); } System.out.println('
' + mssg + ' is sent'); } } // A Class that is used to send messages with the help of threads Threads class ThreadSend extends Thread { private String mssg; Sendr sendr; // Received a messge obj and the string // mssge that has to be sent ThreadSend(String mStr, Sendr obj) { mssg = mStr; sendr = obj; } public void run() { // Only a single thread is allowed to send a message // at a time. synchronized(sendr) { // synchronizing the send object sendr.sendMethod(mssg); } } } // Driver class public class ThrowNullExcep2 { // main method public static void main(String args[]) { Sendr sendObj = null; ThreadSend Sth1 = new ThreadSend( ' Hello ' , sendObj ); ThreadSend Sth2 = new ThreadSend( ' Bye Bye ' , sendObj ); // Starting the two threads of the ThreadedSend type Sth1.start(); Sth2.start(); // waiting for the threads to end try { Sth1.join(); Sth2.join(); } catch(Exception exp) { System.out.println('Interrupted : ' + exp); } } } 

Uitgang:

 Exception in thread 'Thread-0' Exception in thread 'Thread-1' java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) 
  • In plaats van een waarde te gooien, wordt Null gegooid.

Bestandsnaam: ThrowNullExcep3.java

 // Modifying or accessing the fields of the Null object. public class ThrowExcep3 { int a; // main method public static void main(String args[]) { // assigning a null value ThrowExcep3 obj = null; obj.a = 3; } } 

Uitgang:

 Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10) 

Vereiste van NULL-waarde

Een null is een speciale waarde die in Java wordt gebruikt. Het wordt meestal gebruikt om aan te geven dat er geen waarde wordt toegewezen aan de referentievariabele. Een nulwaarde wordt voornamelijk gebruikt bij de implementatie van datastructuren zoals een gekoppelde lijst of boom. Het wordt ook gebruikt in het Singleton-patroon.

Natasha Dalal

De NullPointerException vermijden

Om de NullPointerException te vermijden, moet men ervoor zorgen dat de initialisatie van alle objecten correct wordt uitgevoerd voordat men ze kan gebruiken. Wanneer men een referentievariabele declareert, moet men verifiëren dat de nulwaarde niet aan de referentie is toegewezen voordat de referentiewaarde wordt gebruikt om toegang te krijgen tot het veld of de methode.

Let bij de oplossing op de volgende veelvoorkomende problemen.

Zaak 1: Vergelijking van snaren met de letterlijke

Een van de veel voorkomende problemen is de vergelijking van een letterlijke variabele met een String-variabele. De letterlijke kan een element uit een Enum of uit een String zijn. In plaats van de methode aan te roepen vanuit het null-object, kunt u overwegen deze aan te roepen met behulp van de letterlijke waarde.

Bestandsnaam: NullPntrExcption.java

 import java.io.*; public class NullPntrExcption { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // The following line of code will raise the NullPointerException // It is because the pntr is null if (pntr.equals('JTP')) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Uitgang:

 NullPointerException has been caught. 

Laten we nu eens kijken hoe we dit kunnen vermijden.

Bestandsnaam: NullPntrExcption1.java

 public class NullPntrExcption1 { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // Now, the following line of code will not raise the NullPointerException // It is because the string literal is invoking the equals() method if ('JTP'.equals(pntr)) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Uitgang:

normale vormen
 NullPointerException has been caught. 

Geval 2: Houd de methodeargumenten in de gaten

Men moet eerst de methodeargumenten controleren op de nulwaarden en dan doorgaan met de uitvoering van de methode. Anders is de kans groot dat er een IllegalArgumentException wordt gegenereerd en dat de aanroepende methode ook wordt gesignaleerd dat er iets mis is met de doorgegeven argumenten.

Bestandsnaam: NullPntrExcption2.java

 // A program for demonstrating that one must // check the parameters are null or not before // using them. import java.io.*; public class NullPntrExcption2 { public static void main (String[] args) { // String st is an empty string and invoking method getLength() String st = ''; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // String s set to a value and invoking method getLength() st = 'JTP'; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // Setting st with a value null and invoking method getLength() st = null; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught. ' + exp); } } // method taht computes the length of a string st. // It throws and IllegalArgumentException, if st is null public static int getLength(String st) { if (st == null) { throw new IllegalArgumentException('The argument can never be null.'); } return st.length(); } } 

Uitgang:

Java-tekenreeks naar json
 0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null. 

Geval 3: Gebruik van ternaire operator

Men kan ook de ternaire operator gebruiken om de NullPointerException te vermijden. In ternair wordt de Booleaanse expressie eerst geëvalueerd. Als de expressie als waar wordt geëvalueerd, wordt val1 geretourneerd. Anders wordt de val2 geretourneerd.

Bestandsnaam: NullPntrExcption3.java

 // A program for demonstrating the fact that // NullPointerException can be avoided using the ternary operator. import java.io.*; public class NullPntrExcption3 { // main method public static void main (String[] args) { // Initializing String variable with null value String st = null; String mssge = (st == null) ? 'String is Null.' : st.substring(0, 5); System.out.println(mssge); // Initializing the String variable with string literal st = 'javaTpoint'; mssge = (st == null) ? '' : st.substring(0, 10); System.out.println(mssge); } } 

Uitgang:

 String is Null. javaTpoint