logo

Exception de pointeur nul en Java

Dans ce tutoriel, nous allons apprendre l'exception de pointeur Null en Java. L'exception de pointeur nul est une exception d'exécution. Null est un type spécial de valeur qui peut être attribué à la référence d'un objet. Chaque fois que l'on essaie d'utiliser une référence qui a la valeur Null, l'exception NullPointerException est levée.

Différents scénarios pour l'exception de pointeur nul

Observez certains des scénarios suivants dans lesquels NullPointerException peut être déclenchée.

annotations de démarrage au printemps
  • Calculer la taille ou la longueur du Null comme s’il s’agissait d’un tableau d’éléments.

Nom de fichier: 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); } } 

Sortir:

Exception dans le thread 'main' java.lang.NullPointerException : impossible de lire la longueur du tableau car '' est nul à ThrowNullExcep.main (ThrowNullExcep.java:7)
  • Appel d'une méthode en utilisant l'objet qui a la valeur Null.

Nom de fichier: 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(); } } 

Sortir:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Lorsque vous essayez de synchroniser sur un objet NULL.

Nom de fichier: 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); } } } 

Sortir:

 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) 
  • Au lieu de lancer une valeur, Null est lancé.

Nom de fichier: 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; } } 

Sortir:

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

Exigence de valeur NULL

Une valeur nulle est une valeur spéciale utilisée en Java. Il est généralement utilisé pour montrer qu’aucune valeur n’est attribuée à la variable de référence. Une valeur nulle est principalement utilisée dans l'implémentation de structures de données telles qu'une liste chaînée ou un arbre. Il est également utilisé dans le modèle Singleton.

Éviter l'exception NullPointerException

Afin d'éviter l'exception NullPointerException, il faut s'assurer que l'initialisation de tous les objets est effectuée correctement avant de pouvoir les utiliser. Lorsque l'on déclare une variable de référence, il faut vérifier que la valeur nulle n'est pas affectée à la référence avant que la valeur de référence ne soit utilisée pour accéder au champ ou à la méthode.

Observez les problèmes courants suivants avec la solution.

Cas 1: Comparaison des chaînes avec le littéral

L'un des problèmes courants inclut la comparaison d'un littéral avec une variable String. Le littéral peut être un élément d’un Enum ou d’une String. Au lieu d’invoquer la méthode à partir de l’objet nul, envisagez de l’invoquer en utilisant le littéral.

Nom de fichier: 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.'); } } } 

Sortir:

 NullPointerException has been caught. 

Voyons maintenant comment l'éviter.

Nom de fichier: 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.'); } } } 

Sortir:

 NullPointerException has been caught. 

Cas 2 : Garder un œil sur les arguments de la méthode

Il faut d'abord vérifier les arguments de la méthode pour les valeurs nulles, puis procéder à l'exécution de la méthode. Sinon, il y a de bonnes chances qu'il lève une IllegalArgumentException et signale également à la méthode appelante qu'elle a tort avec les arguments qui ont été transmis.

Nom de fichier: 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(); } } 

Sortir:

 0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null. 

Cas 3 : Utilisation de l'opérateur ternaire

On peut également utiliser l'opérateur ternaire afin d'éviter l'exception NullPointerException. En ternaire, l'expression booléenne est évaluée en premier. Si l’expression est évaluée comme vraie, alors val1 est renvoyé. Sinon, le val2 est renvoyé.

Nom de fichier: NullPntrExcption3.java

comment concaténer des chaînes en 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); } } 

Sortir:

 String is Null. javaTpoint