Comment vérifier si un objet est null en Java

JavaJavaBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), vous apprendrez les techniques essentielles pour vérifier si un objet est nul en Java, une compétence fondamentale pour éviter les erreurs de NullPointerException. Nous commencerons par explorer la méthode la plus basique : utiliser l'opérateur d'égalité (==) pour comparer directement une variable de référence avec null.

En nous appuyant sur cela, nous examinerons ensuite comment combiner les vérifications de nullité avec les vérifications de type pour garantir à la fois l'existence et le bon type d'un objet. Enfin, nous plongerons dans l'utilisation de la classe Optional, une fonctionnalité moderne de Java qui offre une manière plus idiomatique et plus sûre de gérer les valeurs potentiellement nulles, favorisant ainsi un code plus robuste et plus lisible.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/BasicSyntaxGroup -.-> java/type_casting("Type Casting") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/data_types -.-> lab-560011{{"Comment vérifier si un objet est null en Java"}} java/operators -.-> lab-560011{{"Comment vérifier si un objet est null en Java"}} java/variables -.-> lab-560011{{"Comment vérifier si un objet est null en Java"}} java/if_else -.-> lab-560011{{"Comment vérifier si un objet est null en Java"}} java/type_casting -.-> lab-560011{{"Comment vérifier si un objet est null en Java"}} java/classes_objects -.-> lab-560011{{"Comment vérifier si un objet est null en Java"}} java/object_methods -.-> lab-560011{{"Comment vérifier si un objet est null en Java"}} end

Utilisation de l'opérateur d'égalité pour la vérification de nullité

Dans cette étape, nous explorerons l'une des méthodes les plus basiques pour vérifier la nullité (null) en Java : l'utilisation de l'opérateur d'égalité (==). Comprendre comment gérer la nullité est crucial en programmation Java pour éviter les erreurs.

En Java, null est une valeur spéciale qui indique qu'une variable de référence ne pointe vers aucun objet. Imaginez une variable comme une boîte et un objet comme quelque chose que vous mettez dans la boîte. Si la boîte est vide, la variable est null. Tenter d'utiliser une référence null (comme essayer d'utiliser quelque chose dans une boîte vide) entraîne souvent une NullPointerException, une erreur courante et frustrante pour les débutants.

Créons un simple programme Java pour démontrer comment vérifier la nullité à l'aide de l'opérateur d'égalité.

  1. Ouvrez le fichier HelloJava.java dans l'éditeur WebIDE s'il n'est pas déjà ouvert.

  2. Remplacez tout le contenu du fichier par le code suivant :

    public class HelloJava {
        public static void main(String[] args) {
            String message = null; // Déclaration d'une variable String et initialisation à null
    
            // Vérification si la variable message est null en utilisant l'opérateur d'égalité
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is: " + message);
            }
    
            message = "Hello, World!"; // Attribution d'un objet String à la variable
    
            // Nouvelle vérification après avoir attribué une valeur
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is: " + message);
            }
        }
    }

    Dans ce code :

    • Nous déclarons une variable String nommée message et l'initialisons à null.
    • Nous utilisons une instruction if avec l'opérateur d'égalité (==) pour vérifier si message est null.
    • Si message == null est vrai, nous affichons "The message is null.".
    • Si c'est faux, nous affichons le message lui-même.
    • Nous attribuons ensuite la chaîne de caractères "Hello, World!" à la variable message.
    • Nous effectuons à nouveau la vérification de nullité pour voir la différence de sortie.
  3. Enregistrez le fichier (Ctrl+S ou Cmd+S).

  4. Compilez le programme en utilisant la commande javac dans le terminal :

    javac HelloJava.java

    S'il n'y a pas d'erreurs, la compilation est réussie.

  5. Exécutez le programme compilé en utilisant la commande java :

    java HelloJava

    Vous devriez voir la sortie suivante :

    The message is null.
    The message is: Hello, World!

    Cette sortie confirme que notre vérification de nullité avec == a fonctionné correctement. Lorsque message était null, la première condition if était vraie. Après avoir attribué une valeur, la deuxième condition if était fausse et le bloc else a été exécuté.

L'utilisation de l'opérateur d'égalité (==) est la méthode standard et recommandée pour vérifier si une variable de référence est null en Java. Elle est simple, claire et efficace.

Combinaison de vérifications de nullité et de type

Dans cette étape, nous apprendrons à combiner la vérification de nullité (null) avec la vérification du type d'un objet. C'est un scénario courant lorsque vous recevez un objet et que vous devez vous assurer qu'il n'est pas null et qu'il est d'un type spécifique avant de pouvoir l'utiliser.

Java fournit l'opérateur instanceof pour vérifier si un objet est une instance d'une classe particulière ou implémente une interface spécifique. Nous pouvons combiner cela avec notre vérification de nullité en utilisant l'opérateur logique ET (&&).

Modifions notre programme HelloJava.java pour démontrer cela.

  1. Ouvrez le fichier HelloJava.java dans l'éditeur WebIDE.

  2. Remplacez le code existant par le suivant :

    public class HelloJava {
        public static void main(String[] args) {
            Object myObject = "This is a String"; // Déclaration d'une variable de type Object
    
            // Vérification si myObject n'est pas null ET est une instance de String
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject; // Conversion de l'objet en String
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
    
            myObject = null; // Affectation de null à l'objet
    
            // Nouvelle vérification après avoir affecté null
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject;
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
    
            myObject = 123; // Affectation d'un entier à l'objet
    
            // Nouvelle vérification après avoir affecté un entier
            if (myObject != null && myObject instanceof String) {
                String message = (String) myObject;
                System.out.println("The object is a non-null String: " + message);
            } else {
                System.out.println("The object is null or not a String.");
            }
        }
    }

    Dans ce code mis à jour :

    • Nous déclarons une variable myObject de type Object. Object est la classe de base de toutes les classes en Java, donc elle peut contenir une référence à n'importe quel objet.
    • Nous affectons d'abord une String à myObject.
    • La condition if myObject != null && myObject instanceof String vérifie deux choses :
      • myObject != null : La référence de l'objet n'est-elle pas null ?
      • myObject instanceof String : L'objet est-il une instance de la classe String ?
    • L'opérateur && signifie que les deux conditions doivent être vraies pour que le code à l'intérieur du bloc if s'exécute.
    • Si les deux sont vraies, nous convertissons myObject en String en utilisant (String) myObject et nous affichons un message. La conversion est nécessaire car myObject est déclaré comme Object, et nous devons indiquer au compilateur que nous savons qu'il s'agit en réalité d'une String pour pouvoir la traiter comme telle.
    • Si l'une des conditions est fausse (l'objet est null ou n'est pas une String), le bloc else est exécuté.
    • Nous testons ensuite la condition if avec myObject affecté à null puis affecté à un Integer (qui n'est pas une String).
  3. Enregistrez le fichier.

  4. Compilez le programme :

    javac HelloJava.java
  5. Exécutez le programme :

    java HelloJava

    Vous devriez voir la sortie suivante :

    The object is a non-null String: This is a String
    The object is null or not a String.
    The object is null or not a String.

    Cette sortie montre que la condition if a correctement identifié quand l'objet était une String non nulle et quand il était soit null soit pas une String.

Combiner != null et instanceof est un modèle standard en Java lorsque vous avez besoin de travailler en toute sécurité avec des objets d'un type spécifique qui peuvent également être null.

Utilisation de la classe Optional pour gérer les valeurs nulles

Dans cette étape, nous allons explorer une approche plus moderne pour gérer les valeurs potentiellement nulles (null) en Java, introduite en Java 8 : la classe Optional. Optional est un objet conteneur qui peut contenir une valeur non nulle ou être vide. Il offre un moyen de représenter de manière plus explicite la présence ou l'absence d'une valeur, ce qui contribue à réduire le risque de NullPointerException.

L'utilisation de Optional incite à prendre en compte la possibilité d'une absence de valeur et à gérer ce cas de manière élégante, plutôt que de compter sur des vérifications de nullité réparties dans tout le code.

Modifions notre programme HelloJava.java pour utiliser Optional.

  1. Ouvrez le fichier HelloJava.java dans l'éditeur WebIDE.

  2. Remplacez le code existant par le suivant :

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Création d'un Optional contenant une valeur
            Optional<String> optionalMessageWithValue = Optional.of("Hello from Optional!");
    
            // Création d'un Optional vide (représente null)
            Optional<String> optionalMessageWithoutValue = Optional.empty();
    
            // Gestion de l'Optional contenant une valeur
            if (optionalMessageWithValue.isPresent()) {
                String message = optionalMessageWithValue.get(); // Récupération de la valeur si elle est présente
                System.out.println("Optional with value: " + message);
            } else {
                System.out.println("Optional with value is empty.");
            }
    
            // Gestion de l'Optional sans valeur
            if (optionalMessageWithoutValue.isPresent()) {
                String message = optionalMessageWithoutValue.get();
                System.out.println("Optional without value: " + message);
            } else {
                System.out.println("Optional without value is empty.");
            }
    
            // Une manière plus concise de gérer l'Optional avec ifPresent
            optionalMessageWithValue.ifPresent(msg -> System.out.println("Using ifPresent: " + msg));
    
            // Utilisation de orElse pour fournir une valeur par défaut si l'Optional est vide
            String messageOrDefault = optionalMessageWithoutValue.orElse("Default Message");
            System.out.println("Using orElse: " + messageOrDefault);
        }
    }

    Dans ce code :

    • Nous importons la classe Optional.
    • Nous créons un Optional<String> contenant une valeur en utilisant Optional.of(). Notez que Optional.of() lèvera une NullPointerException si vous lui passez null. Si la valeur peut être null, utilisez plutôt Optional.ofNullable().
    • Nous créons un Optional<String> vide en utilisant Optional.empty().
    • Nous utilisons optionalMessageWithValue.isPresent() pour vérifier si l'Optional contient une valeur. Si c'est le cas, nous pouvons récupérer la valeur en utilisant optionalMessageWithValue.get(). Attention : appeler get() sur un Optional vide lèvera une NoSuchElementException.
    • Nous montrons comment gérer de la même manière un Optional vide.
    • Nous présentons ifPresent(), qui exécute une action donnée uniquement si une valeur est présente. C'est une manière plus propre d'exécuter une action sur la valeur si elle existe.
    • Nous présentons orElse(), qui renvoie la valeur si elle est présente, sinon renvoie une valeur par défaut. Cela est utile pour fournir des valeurs de secours.
  3. Enregistrez le fichier.

  4. Compilez le programme :

    javac HelloJava.java
  5. Exécutez le programme :

    java HelloJava

    Vous devriez voir la sortie suivante :

    Optional with value: Hello from Optional!
    Optional without value is empty.
    Using ifPresent: Hello from Optional!
    Using orElse: Default Message

    Cette sortie montre comment Optional peut être utilisé pour gérer de manière plus explicite et plus sûre la présence ou l'absence de valeurs par rapport aux vérifications de nullité traditionnelles. Bien que Optional ne soit pas un remplacement pour toutes les vérifications de nullité, c'est un outil précieux pour concevoir des API et écrire du code où l'absence d'une valeur est un scénario valide et attendu.

Résumé

Dans ce laboratoire, nous avons appris les techniques fondamentales pour vérifier si un objet est null en Java. Nous avons commencé par explorer la méthode la plus basique : utiliser l'opérateur d'égalité (==) pour comparer directement une variable de référence avec null. Ce simple test est essentiel pour éviter les erreurs de NullPointerException.

Nous sommes ensuite passés à des scénarios plus avancés, bien que le contenu fourni ne détaille que le test d'égalité de base. Un laboratoire complet couvrirait probablement la combinaison de vérifications de nullité avec des vérifications de type et l'utilisation de la classe Optional, une fonctionnalité moderne de Java conçue pour gérer plus élégamment et de manière plus expressive les valeurs potentiellement nulles, favorisant ainsi un code plus propre et plus sûr.