logo

Exception de pointeur nul en Java

Une NullPointerException en Java est une RuntimeException. Cela se produit lorsqu'un programme tente d'utiliser une référence d'objet ayant la valeur nulle. En Java, « null » est une valeur spéciale qui peut être attribuée aux références d'objet pour indiquer l'absence de valeur.

Raisons de l’exception de pointeur nul

Une NullPointerException se produit pour les raisons suivantes : 

  • Appel d'une méthode à partir d'un objet nul.
  • Accéder ou modifier le champ d’un objet nul.
  • Prendre la longueur de null comme s'il s'agissait d'un tableau.
  • Accéder ou modifier les emplacements des objets nuls comme s'il s'agissait d'un tableau.
  • Lancer null comme s'il s'agissait d'une valeur Throwable.
  • Lorsque vous essayez de synchroniser sur un objet nul.

Exemple:



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

Sortir:

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

Explication: Dans cet exemple, la référence de chaîne « s » est nulle. Lorsque le programme tente d'appeler la méthode length(), il lève une NullPointerException car il n'y a pas d'objet réel.

commande git push

Pourquoi null est-il utilisé en Java ?

La valeur nulle sert d'espace réservé et indique qu'aucune valeur n'est attribuée à une variable de référence. Les applications courantes incluent :

  • Structures de données liées : Il représente la fin d’une liste ou d’une branche d’arbre.
  • Modèles de conception : Ceci est utilisé dans des modèles tels que le modèle d'objet nul ou le modèle Singleton.

Comment éviter NullPointerException

Pour éviter l'exception NullPointerException, nous devons nous assurer que tous les objets sont correctement initialisés avant de les utiliser. Lorsque nous déclarons une variable de référence, nous devons vérifier que l'objet n'est pas nul avant de demander une méthode ou un champ aux objets.

1. Utilisation de chaînes littérales dans equals()

Un problème très courant implique la comparaison entre une variable String et un littéral. Le littéral peut être une chaîne ou un élément d'une énumération. Au lieu d'invoquer la méthode à partir de l'objet nul, envisagez de l'invoquer à partir du littéral. 

Exemple:

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

Sortir
NullPointerException Caught

Nous pouvons éviter NullPointerException en appelant égal au littéral plutôt qu'à l'objet.

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

Sortir
Not Same

Note : Invoquez toujours égal sur le littéral pour éviter d'appeler une méthode sur une référence nulle.

2. Vérification des arguments de la méthode

Avant d'exécuter le corps de la nouvelle méthode, nous devons d'abord vérifier ses arguments pour les valeurs nulles et continuer l'exécution de la méthode uniquement lorsque les arguments sont correctement vérifiés. Sinon, il lancera une IllegalArgumentException et informera la méthode appelante que quelque chose ne va pas avec les arguments passés. 

xd xd signification

Exemple:

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

Sortir
0 13 IllegalArgumentException caught 

3. Utiliser l'opérateur ternaire

L'opérateur ternaire peut être utilisé pour éviter NullPointerException. L’expression booléenne est d’abord évaluée. Si l'expression est vraie alors la valeur1 est renvoyée sinon la valeur2 est renvoyée. Nous pouvons utiliser l'opérateur ternaire pour gérer les pointeurs nuls.

Exemple:

qu'est-ce que l'expression régulière Java
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);  } } 

Sortir
Geeks 

Explication : L'opérateur ternaire permet de vérifier la valeur NULL et d'éviter les opérations sur les références NULL.

4. Utilisation de la classe facultative (Java 8+)

Dans Java 8, la classe facultative a été introduite en tant qu'objet conteneur pouvant ou non contenir une valeur non nulle. Cela permet d'éviter NullPointerException en forçant à traiter explicitement le cas où une valeur est absente.

Exemple:

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

Sortir
Default Name 

Explication: Facultatif.ofNullable(value) encapsule la valeur qui pourrait être nulle. orElse() fournit une solution de secours si la valeur n'est pas présente.