Lire en anglais

Partager via


NullReferenceException Classe

Définition

Exception levée au moment d'une tentative de suppression de la référence à une référence d'objet null.

C#
public class NullReferenceException : Exception
C#
public class NullReferenceException : SystemException
C#
[System.Serializable]
public class NullReferenceException : SystemException
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class NullReferenceException : SystemException
Héritage
NullReferenceException
Héritage
NullReferenceException
Attributs

Remarques

Une NullReferenceException exception est levée lorsque vous essayez d’accéder à un membre sur un type dont la valeur est null. Une NullReferenceException exception reflète généralement une erreur du développeur et est levée dans les scénarios suivants :

  • Vous avez oublié d’instancier un type de référence. Dans l’exemple suivant, names est déclaré mais jamais instancié :

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main(string[] args)
       {
          int value = Int32.Parse(args[0]);
          List<String> names;
          if (value > 0)
             names = new List<String>();
    
          names.Add("Major Major Major");
       }
    }
    // Compilation displays a warning like the following:
    //    Example1.cs(10) : warning BC42104: Variable //names// is used before it
    //    has been assigned a value. A null reference exception could result
    //    at runtime.
    //
    //          names.Add("Major Major Major")
    //          ~~~~~
    // The example displays output like the following output:
    //    Unhandled Exception: System.NullReferenceException: Object reference
    //    not set to an instance of an object.
    //       at Example.Main()
    

    Certains compilateurs émettent un avertissement lorsqu’ils compilent ce code. D’autres émettent une erreur et la compilation échoue. Pour résoudre ce problème, instanciez l’objet afin que sa valeur ne soit plus null. Pour ce faire, l’exemple suivant appelle le constructeur de classe d’un type.

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = new List<String>();
          names.Add("Major Major Major");
       }
    }
    
  • Vous avez oublié de dimensionner un tableau avant de l’initialiser. Dans l’exemple suivant, values est déclaré comme un tableau d’entiers, mais le nombre d’éléments qu’il contient n’est jamais spécifié. La tentative d’initialisation de ses valeurs a donc lève une NullReferenceException exception.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = null;
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);
       }
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    Vous pouvez éliminer l’exception en déclarant le nombre d’éléments dans le tableau avant de l’initialiser, comme le fait l’exemple suivant.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = new int[10];
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);
       }
    }
    // The example displays the following output:
    //    0
    //    2
    //    4
    //    6
    //    8
    //    10
    //    12
    //    14
    //    16
    //    18
    

    Pour plus d’informations sur la déclaration et l’initialisation de tableaux, consultez Tableaux et tableaux.

  • Vous obtenez une valeur de retour Null à partir d’une méthode, puis vous appelez une méthode sur le type retourné. Cela est parfois le résultat d’une erreur de documentation ; la documentation ne parvient pas à noter qu’un appel de méthode peut retourner null. Dans d’autres cas, votre code suppose par erreur que la méthode retournera toujours une valeur non null .

    Le code de l’exemple suivant suppose que la méthode retourne Person toujours un Array.Find objet dont FirstName le champ correspond à une chaîne de recherche. Étant donné qu’il n’existe aucune correspondance, le runtime lève une NullReferenceException exception.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra",
                                              "Abraham", "Adrian", "Ariella",
                                              "Arnold", "Aston", "Astor" } );
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          Console.WriteLine(found.FirstName);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames)
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       }
    
       public String FirstName;
    }
    // The example displays the following output:
    //       Unhandled Exception: System.NullReferenceException:
    //       Object reference not set to an instance of an object.
    //          at Example.Main()
    

    Pour résoudre ce problème, testez la valeur de retour de la méthode pour vous assurer qu’elle ne l’est pas null avant d’appeler l’un de ses membres, comme le fait l’exemple suivant.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra",
                                              "Abraham", "Adrian", "Ariella",
                                              "Arnold", "Aston", "Astor" } );
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          if (found != null)
             Console.WriteLine(found.FirstName);
          else
             Console.WriteLine("{0} not found.", nameToFind);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames)
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       }
    
       public String FirstName;
    }
    // The example displays the following output:
    //        Robert not found
    
  • Vous utilisez une expression (par exemple, vous chaînez une liste de méthodes ou de propriétés ensemble) pour récupérer une valeur et, bien que vous vérifiiez si la valeur est null, le runtime lève toujours une NullReferenceException exception. Cela se produit parce que l’une des valeurs intermédiaires dans l’expression retourne null. Par conséquent, votre test pour null n’est jamais évalué.

    L’exemple suivant définit un Pages objet qui met en cache des informations sur les pages web, qui sont présentées par Page des objets. La Example.Main méthode vérifie si la page web active a un titre non null et, si c’est le cas, affiche le titre. Malgré cette case activée, la méthode lève toutefois une NullReferenceException exception.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          if (! String.IsNullOrEmpty(pages.CurrentPage.Title)) {
             String title = pages.CurrentPage.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
       }
    }
    
    public class Pages
    {
       Page[] page = new Page[10];
       int ctr = 0;
    
       public Page CurrentPage
       {
          get { return page[ctr]; }
          set {
             // Move all the page objects down to accommodate the new one.
             if (ctr > page.GetUpperBound(0)) {
                for (int ndx = 1; ndx <= page.GetUpperBound(0); ndx++)
                   page[ndx - 1] = page[ndx];
             }
             page[ctr] = value;
             if (ctr < page.GetUpperBound(0))
                ctr++;
          }
       }
    
       public Page PreviousPage
       {
          get {
             if (ctr == 0) {
                if (page[0] == null)
                   return null;
                else
                   return page[0];
             }
             else {
                ctr--;
                return page[ctr + 1];
             }
          }
       }
    }
    
    public class Page
    {
       public Uri URL;
       public String Title;
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    L’exception est levée, car pages.CurrentPage retourne null si aucune information de page n’est stockée dans le cache. Cette exception peut être corrigée en testant la valeur de la CurrentPage propriété avant de récupérer la propriété de Title l’objet actuelPage, comme le fait l’exemple suivant :

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          Page current = pages.CurrentPage;
          if (current != null) {
             String title = current.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
          else {
             Console.WriteLine("There is no page information in the cache.");
          }
       }
    }
    // The example displays the following output:
    //       There is no page information in the cache.
    
  • Vous énumérez les éléments d’un tableau qui contient des types référence, et votre tentative de traitement de l’un des éléments lève une NullReferenceException exception.

    L’exemple suivant définit un tableau de chaînes. Une for instruction énumère les éléments du tableau et appelle la méthode de Trim chaque chaîne avant d’afficher la chaîne.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}", values[ctr].Trim(),
                           ctr == values.GetUpperBound(0) ? "" : ", ");
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    Cette exception se produit si vous partez du principe que chaque élément du tableau doit contenir une valeur non null, et que la valeur de l’élément de tableau est en fait null. L’exception peut être éliminée en testant si l’élément est null avant d’effectuer une opération sur cet élément, comme le montre l’exemple suivant.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}",
                           values[ctr] != null ? values[ctr].Trim() : "",
                           ctr == values.GetUpperBound(0) ? "" : ", ");
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //       one, , two
    
  • Une NullReferenceException exception peut être levée par une méthode lorsqu’elle accède à un membre de l’un de ses arguments, mais cet argument est null. La PopulateNames méthode de l’exemple suivant lève l’exception à la ligne names.Add(arrName);.

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = GetData();
          PopulateNames(names);
       }
    
       private static void PopulateNames(List<String> names)
       {
          String[] arrNames = { "Dakota", "Samuel", "Nikita",
                                "Koani", "Saya", "Yiska", "Yumaevsky" };
          foreach (var arrName in arrNames)
             names.Add(arrName);
       }
    
       private static List<String> GetData()
       {
          return null;
       }
    }
    // The example displays output like the following:
    //    Unhandled Exception: System.NullReferenceException: Object reference
    //    not set to an instance of an object.
    //       at Example.PopulateNames(List`1 names)
    //       at Example.Main()
    

    Pour résoudre ce problème, assurez-vous que l’argument passé à la méthode n’est pas nullou gérez l’exception levée dans un try…catch…finally bloc. Pour plus d'informations, consultez Exceptions.

Les instructions MSIL suivantes lèvent NullReferenceException: callvirt, cpblk, cpobj, ldelem.<type>ldfldainitblkldfldldelema, , ldind.<type>, ldlenstfldstind.<type>stelem.<type>throwet .unbox

NullReferenceException utilise le COR_E_NULLREFERENCE HRESULT, qui a la valeur 0x80004003.

Pour obtenir la liste des valeurs initiales des propriétés d’une instance de NullReferenceException, consultez le NullReferenceException constructeurs.

Gestion de NullReferenceException dans le code de mise en production

Il est généralement préférable d’éviter une exception NullReferenceException plutôt que de la gérer une fois qu’elle s’est produite. La gestion d'une exception peut compliquer la tenue à jour et la compréhension de votre code. En outre, cela peut parfois introduire d'autres bogues. Une exception NullReferenceException est souvent une erreur non récupérable. Dans ce cas, la meilleure alternative peut consister à laisser l'exception arrêter l'application.

Toutefois, il existe de nombreuses situations où la gestion de l'erreur peut être utile.

  • Votre application peut ignorer des objets dont la valeur est null. Par exemple, si votre application récupère et traite des enregistrements dans une base de données, vous pouvez ignorer un certain nombre d'enregistrements incorrects qui engendrent des objets null. L'enregistrement de données incorrectes dans un fichier journal ou dans l'interface utilisateur de l'application peut être la solution.

  • Vous pouvez vous remettre d'une exception. Par exemple, un appel à un service web qui retourne un type référence peut retourner null si la connexion est perdue ou si la connexion expire. Vous pouvez tenter de rétablir la connexion et réessayer l’appel.

  • Vous pouvez restaurer l'état valide de votre application. Par exemple, vous pouvez effectuer une tâche en plusieurs étapes nécessitant l'enregistrement d'informations dans une banque de données avant d'appeler une méthode qui lève une exception NullReferenceException. Si l'objet non initialisé risque d'endommager l'enregistrement des données, supprimez les données précédentes avant de fermer l'application.

  • Vous voulez signaler l'exception. Par exemple, si l’erreur a été provoquée par une erreur de l’utilisateur de votre application, vous pouvez générer un message pour l’aider à fournir les informations correctes. Vous pouvez également enregistrer des informations sur l'erreur pour vous aider à corriger le problème. Certaines infrastructures, comme ASP.NET, disposent d'un gestionnaire d'exceptions de haut niveau qui capture toutes les erreurs pour éviter tout blocage de l'application. Dans ce cas, la journalisation de l'exception peut représenter pour vous la seule façon de savoir que cela se produit.

Constructeurs

NullReferenceException()

Initialise une nouvelle instance de la NullReferenceException classe, en définissant la Message propriété de la nouvelle instance sur un message fourni par le système qui décrit l’erreur, par exemple « La valeur 'null' a été trouvée là où une instance d’un objet était requise ». Ce message prend en compte la culture système actuelle.

NullReferenceException(SerializationInfo, StreamingContext)
Obsolète.

Initialise une nouvelle instance de la classe NullReferenceException avec des données sérialisées.

NullReferenceException(String)

Initialise une nouvelle instance de la classe NullReferenceException avec un message d'erreur spécifié.

NullReferenceException(String, Exception)

Initialise une nouvelle instance de la classe NullReferenceException avec un message d'erreur spécifié et une référence à l'exception interne ayant provoqué cette exception.

Propriétés

Data

Obtient une collection de paires clé/valeur qui fournissent des informations définies par l'utilisateur supplémentaires sur l'exception.

(Hérité de Exception)
HelpLink

Obtient ou définit un lien vers le fichier d'aide associé à cette exception.

(Hérité de Exception)
HResult

Obtient ou définit HRESULT, valeur numérique codée qui est assignée à une exception spécifique.

(Hérité de Exception)
InnerException

Obtient l'instance Exception qui a provoqué l'exception actuelle.

(Hérité de Exception)
Message

Obtient un message qui décrit l'exception active.

(Hérité de Exception)
Source

Obtient ou définit le nom de l'application ou de l'objet qui est à l'origine de l'erreur.

(Hérité de Exception)
StackTrace

Obtient une représentation sous forme de chaîne des frames immédiats sur la pile des appels.

(Hérité de Exception)
TargetSite

Obtient la méthode qui lève l'exception actuelle.

(Hérité de Exception)

Méthodes

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetBaseException()

En cas de substitution dans une classe dérivée, retourne la Exception qui est à l'origine d'une ou de plusieurs exceptions ultérieures.

(Hérité de Exception)
GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetObjectData(SerializationInfo, StreamingContext)
Obsolète.

En cas de substitution dans une classe dérivée, définit SerializationInfo avec des informations sur l'exception.

(Hérité de Exception)
GetType()

Obtient le type au moment de l'exécution de l'instance actuelle.

(Hérité de Exception)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Crée et retourne une chaîne représentant l'exception actuelle.

(Hérité de Exception)

Événements

SerializeObjectState
Obsolète.

Se produit quand une exception est sérialisée pour créer un objet d'état d'exception qui contient des données sérialisées concernant l'exception.

(Hérité de Exception)

S’applique à

Produit Versions
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Voir aussi