Comment vérifier si un ArrayList 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), nous allons explorer différentes techniques pour vérifier si un ArrayList en Java est nul (null). La gestion des valeurs null est un aspect fondamental de la programmation Java robuste, et il est essentiel de savoir le faire correctement pour éviter les erreurs de NullPointerException.

Nous commencerons par examiner la méthode la plus basique, qui consiste à utiliser l'opérateur d'égalité (==) pour vérifier directement si la valeur est nulle (null). Ensuite, nous apprendrons à combiner les vérifications de nullité avec les vérifications de liste vide pour gérer efficacement les deux scénarios. Enfin, nous explorerons l'utilisation de la classe Optional, une fonctionnalité moderne de Java qui offre un moyen plus expressif et plus sûr de gérer les valeurs potentiellement nulles.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/StringManipulationGroup -.-> java/strings("Strings") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/variables -.-> lab-560005{{"Comment vérifier si un ArrayList est null en Java"}} java/if_else -.-> lab-560005{{"Comment vérifier si un ArrayList est null en Java"}} java/strings -.-> lab-560005{{"Comment vérifier si un ArrayList est null en Java"}} java/classes_objects -.-> lab-560005{{"Comment vérifier si un ArrayList est null en Java"}} java/object_methods -.-> lab-560005{{"Comment vérifier si un ArrayList est null en Java"}} java/string_methods -.-> lab-560005{{"Comment vérifier si un ArrayList est null en Java"}} end

Test de nullité à l'aide de l'opérateur d'égalité

Dans cette étape, nous allons explorer la méthode la plus basique pour vérifier si une variable en Java contient une valeur null : en utilisant l'opérateur d'égalité (==). Comprendre comment gérer les valeurs null est crucial en programmation Java pour éviter les erreurs.

En Java, null est une valeur spéciale qui indique qu'une variable ne fait référence à aucun objet. Imaginez-le comme une boîte vide – la boîte existe, mais il n'y a rien dedans. Si vous essayez d'utiliser une variable qui vaut null comme si elle faisait référence à un objet (par exemple, en appelant une méthode sur elle), vous obtiendrez une NullPointerException, qui est une erreur très courante en Java.

L'opérateur d'égalité (==) est utilisé pour comparer deux valeurs. Lorsque vous comparez une référence d'objet avec null, == vérifie si la référence pointe vers la valeur null.

Créons un simple programme Java pour illustrer cela.

  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
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is not null: " + message);
            }
    
            message = "Hello, World!"; // Attribution d'un objet String à la variable
    
            // Vérification à nouveau après avoir attribué une valeur
            if (message == null) {
                System.out.println("The message is null.");
            } else {
                System.out.println("The message is not null: " + message);
            }
        }
    }

    Dans ce code :

    • Nous déclarons une variable String nommée message et l'initialisons à null.
    • Nous utilisons une instruction if avec la condition message == null pour vérifier si la variable est null.
    • Nous affichons un message indiquant si la variable est null ou non.
    • Nous attribuons ensuite une valeur String réelle ("Hello, World!") à la variable message.
    • Nous effectuons à nouveau la vérification de null pour voir la différence.
  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 se terminera sans afficher de message.

  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 not null: Hello, World!

    Cette sortie confirme que la vérification == null a correctement identifié quand la variable message était null et quand elle avait une valeur.

L'utilisation de l'opérateur d'égalité (==) est le moyen le plus simple de vérifier la nullité en Java. Cependant, il est important de se rappeler que cela ne fonctionne que pour vérifier si une référence est null. Il ne vérifie pas si une chaîne de caractères est vide (ne contient aucun caractère, comme ""). Nous explorerons comment gérer les chaînes de caractères vides dans l'étape suivante.

Combinaison des vérifications de nullité et de chaîne vide

Dans l'étape précédente, nous avons appris à vérifier si une variable est null en utilisant l'opérateur ==. Cependant, en Java, surtout lorsqu'il s'agit d'objets String, il est souvent nécessaire de vérifier non seulement si une variable est null, mais aussi si elle est "vide". Une chaîne vide est un objet String qui existe mais ne contient aucun caractère (par exemple, ""). Une chaîne null, en revanche, signifie que la variable ne fait référence à aucun objet String du tout.

Tenter d'appeler des méthodes telles que isEmpty() ou length() sur une chaîne null entraînera une NullPointerException. Par conséquent, lorsque vous souhaitez traiter les chaînes null et les chaînes vides de la même manière (par exemple, les considérer comme "vides" ou "manquantes"), vous devez vérifier les deux conditions.

La méthode la plus courante pour faire cela consiste à vérifier d'abord si la chaîne est null, puis, si elle n'est pas null, de vérifier si elle est vide en utilisant la méthode isEmpty().

Modifions notre programme HelloJava.java pour illustrer la combinaison de ces vérifications.

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

  2. Remplacez le code actuel par le suivant :

    public class HelloJava {
        public static void main(String[] args) {
            String text1 = null;
            String text2 = ""; // Une chaîne vide
            String text3 = "Hello"; // Une chaîne non vide
    
            System.out.println("Checking text1 (null):");
            if (text1 == null || text1.isEmpty()) {
                System.out.println("text1 is null or empty.");
            } else {
                System.out.println("text1 is not null and not empty: " + text1);
            }
    
            System.out.println("\nChecking text2 (empty):");
            // Il est crucial de vérifier la nullité en premier !
            if (text2 == null || text2.isEmpty()) {
                System.out.println("text2 is null or empty.");
            } else {
                System.out.println("text2 is not null and not empty: " + text2);
            }
    
            System.out.println("\nChecking text3 (not empty):");
            if (text3 == null || text3.isEmpty()) {
                System.out.println("text3 is null or empty.");
            } else {
                System.out.println("text3 is not null and not empty: " + text3);
            }
        }
    }

    Dans ce code mis à jour :

    • Nous introduisons trois variables String : text1 (null), text2 (vide) et text3 (non vide).
    • Nous utilisons l'opérateur logique OU (||) pour combiner la vérification de nullité (text == null) et la vérification de chaîne vide (text.isEmpty()).
    • La condition text == null || text.isEmpty() sera vraie si text est null OU si text n'est pas null ET que text.isEmpty() est vrai.
    • Important : La vérification de nullité (text == null) doit être placée en premier dans la condition ||. Si text est null, la première partie de la condition || (text == null) est vraie, et Java utilise l'"évaluation paresseuse" pour sauter la deuxième partie (text.isEmpty()), évitant ainsi une NullPointerException. Si la vérification isEmpty() était placée en premier et que text était null, cela causerait une erreur.
  3. Enregistrez le fichier (Ctrl+S ou Cmd+S).

  4. Compilez le programme dans le terminal :

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

    java HelloJava

    Vous devriez voir la sortie suivante :

    Checking text1 (null):
    text1 is null or empty.
    
    Checking text2 (empty):
    text2 is null or empty.
    
    Checking text3 (not empty):
    text3 is not null and not empty: Hello

    Cette sortie montre que notre vérification combinée a correctement identifié à la fois la chaîne null (text1) et la chaîne vide (text2) comme "null ou vide", tout en identifiant correctement la chaîne non vide (text3).

Cette vérification combinée (string == null || string.isEmpty()) est un modèle très courant en Java lorsque vous devez gérer à la fois les chaînes null et les chaînes vides. De nombreuses bibliothèques proposent également des méthodes utilitaires pour cela, telles que StringUtils.isEmpty() ou StringUtils.isBlank() (qui vérifie également les espaces blancs) dans Apache Commons Lang, mais il est essentiel de comprendre la vérification combinée de base.

Utilisation d'Optional pour une gestion sûre

Bien que la vérification des chaînes null et vides en utilisant == null || isEmpty() soit efficace, Java 8 a introduit la classe Optional pour gérer de manière plus explicite et sûre les valeurs potentiellement absentes. Optional est un objet conteneur qui peut ou non contenir une valeur non nulle. En utilisant Optional, vous pouvez éviter les NullPointerException et rendre votre code plus lisible en indiquant clairement qu'une valeur peut être absente.

Optional ne remplace pas entièrement les vérifications de null, mais il offre une approche plus fonctionnelle et expressive pour gérer les situations où une valeur peut être absente.

Voyons comment utiliser Optional dans notre programme HelloJava.java.

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

  2. Remplacez le code actuel par le suivant :

    import java.util.Optional;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text1 = null;
            String text2 = "";
            String text3 = "Hello";
    
            // Création d'objets Optional
            Optional<String> optionalText1 = Optional.ofNullable(text1);
            Optional<String> optionalText2 = Optional.ofNullable(text2);
            Optional<String> optionalText3 = Optional.ofNullable(text3);
    
            System.out.println("Checking optionalText1 (from null):");
            // Vérification si une valeur est présente
            if (optionalText1.isPresent()) {
                System.out.println("optionalText1 contains a value: " + optionalText1.get());
            } else {
                System.out.println("optionalText1 is empty (no value present).");
            }
    
            System.out.println("\nChecking optionalText2 (from empty string):");
            if (optionalText2.isPresent()) {
                System.out.println("optionalText2 contains a value: " + optionalText2.get());
            } else {
                System.out.println("optionalText2 is empty (no value present).");
            }
    
            System.out.println("\nChecking optionalText3 (from non-empty string):");
            if (optionalText3.isPresent()) {
                System.out.println("optionalText3 contains a value: " + optionalText3.get());
            } else {
                System.out.println("optionalText3 is empty (no value present).");
            }
    
            // Utilisation de orElse() pour fournir une valeur par défaut si l'Optional est vide
            String valueOrDefault1 = optionalText1.orElse("Default Value 1");
            String valueOrDefault2 = optionalText2.orElse("Default Value 2");
            String valueOrDefault3 = optionalText3.orElse("Default Value 3");
    
            System.out.println("\nUsing orElse():");
            System.out.println("Value from optionalText1: " + valueOrDefault1);
            System.out.println("Value from optionalText2: " + valueOrDefault2);
            System.out.println("Value from optionalText3: " + valueOrDefault3);
        }
    }

    Analysons les nouvelles parties :

    • import java.util.Optional; : Nous devons importer la classe Optional.
    • Optional.ofNullable(text); : C'est la méthode recommandée pour créer un Optional à partir d'une variable qui peut être null. Si text est null, il crée un Optional vide. Si text n'est pas null, il crée un Optional contenant la valeur de text.
    • optionalText.isPresent() : Cette méthode renvoie true si l'Optional contient une valeur non nulle, et false sinon. C'est un moyen sûr de vérifier si une valeur est présente avant de tenter d'y accéder.
    • optionalText.get() : Cette méthode renvoie la valeur contenue dans l'Optional. Utilisez cette méthode avec prudence ! Si l'Optional est vide (c'est-à-dire que isPresent() est false), l'appel de get() lèvera une NoSuchElementException. Il est généralement préférable d'utiliser d'autres méthodes d'Optional telles que orElse(), orElseGet() ou ifPresent().
    • optionalText.orElse("Default Value") : Cette méthode renvoie la valeur contenue dans l'Optional si elle est présente. Si l'Optional est vide, elle renvoie la valeur par défaut spécifiée. C'est un moyen sûr et pratique de fournir une valeur de secours.
  3. Enregistrez le fichier (Ctrl+S ou Cmd+S).

  4. Compilez le programme :

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

    java HelloJava

    Vous devriez voir une sortie similaire à celle-ci :

    Checking optionalText1 (from null):
    optionalText1 is empty (no value present).
    
    Checking optionalText2 (from empty string):
    optionalText2 contains a value:
    
    Checking optionalText3 (from non-empty string):
    optionalText3 contains a value: Hello
    
    Using orElse():
    Value from optionalText1: Default Value 1
    Value from optionalText2:
    Value from optionalText3: Hello

    Notez que optionalText1 (créé à partir de null) est correctement identifié comme vide. optionalText2 (créé à partir d'une chaîne vide "") n'est pas vide au sens d'Optional car il contient un objet String valide (même si cette chaîne est vide). optionalText3 contient la chaîne "Hello". Les exemples de orElse() montrent comment vous pouvez facilement fournir des valeurs par défaut lorsque l'Optional est vide.

L'utilisation de Optional peut rendre votre code plus robuste et expressif lorsqu'il s'agit de gérer des valeurs qui peuvent être absentes. Il vous incite à penser à la possibilité d'une valeur manquante et à la gérer explicitement, réduisant ainsi les risques de NullPointerException inattendues.

Résumé

Dans ce laboratoire (lab), nous avons appris la méthode fondamentale pour vérifier si une variable, en particulier un ArrayList, est null en Java en utilisant l'opérateur d'égalité (==). Nous avons compris que null signifie l'absence de référence à un objet et que tenter d'utiliser une variable null peut entraîner une NullPointerException. Nous avons pratiqué cette vérification de nullité de base avec un simple programme Java.

Nous avons également exploré des techniques plus robustes pour gérer les valeurs nulles potentielles et les collections vides. Cela incluait la combinaison des vérifications de nullité et de vacuité pour nous assurer que les deux conditions sont prises en compte, ainsi que l'utilisation de la classe Optional pour une approche plus moderne et plus sûre de la gestion des valeurs potentiellement absentes, favorisant un code plus lisible et moins sujet aux erreurs.