Qu'est-ce que NullReferenceException et comment y faire face ? Guide complet pour le développeur C#
\n\nAvez-vous déjà vu ce message effrayant : “Object reference not set to an instance of an object” ? Si vous programmez en C# depuis au moins une semaine, vous l'avez sûrement rencontré. C'est NullReferenceException — l'erreur la plus courante dans le monde .NET. Elle effraie les débutants, mais les développeurs expérimentés le savent : c'est simplement la façon pour le programme de dire “Je ne sais pas avec quoi travailler, donne-moi un objet”.
\n\nDans cet article, nous allons voir pourquoi NullReferenceException se produit, comment la trouver et, surtout, comment la prévenir. Vous apprendrez à écrire un code plus sûr et à passer moins de temps à déboguer.
\n\nQu'est-ce que NullReferenceException en termes simples ?
\n\nImaginez que vous commandez une pizza, mais que le livreur arrive les mains vides. Vous demandez : “Où est ma pizza ?”, et il répond : “Je ne sais pas, je n'ai rien”. C'est à peu près ainsi que fonctionne NullReferenceException. Vous essayez d'appeler une méthode ou d'accéder à une propriété d'une variable qui est égale à null. Le compilateur ne le voit pas, mais pendant l'exécution, le programme plante.
En C#, toute variable de référence (classe, interface, chaîne, tableau) peut être null. Si vous essayez de faire quelque chose avec une telle variable, vous obtiendrez une exception.
Les scénarios les plus fréquents d'apparition de NullReferenceException
\n\nRegardons des exemples de code réels qui mènent à cette erreur.
\n\n1. Variable non initialisée
\nstring name;\nConsole.WriteLine(name.Length); // NullReferenceException\nLa variable name est déclarée, mais non initialisée. Par défaut, elle est égale à null.
2. Une méthode retourne null
\npublic string GetUserName(int id)\n{\n // si l'utilisateur n'est pas trouvé, on retourne null\n return null;\n}\n\nvar user = GetUserName(42);\nConsole.WriteLine(user.ToUpper()); // NullReferenceException\n\n3. Accès à un élément de collection qui n'existe pas
\nvar list = new List<string> { "A", "B" };\nvar item = list[5]; // ArgumentOutOfRangeException, mais si l'élément était null...\n// Et voici un exemple avec Dictionary :\nvar dict = new Dictionary<int, string>();\nvar value = dict[1]; // KeyNotFoundException, mais si la clé existait et que la valeur était null ?\n\n4. Chaîne d'appels
\nclass Address { public string City { get; set; } }\nclass Person { public Address Address { get; set; }\n\nvar person = new Person();\nConsole.WriteLine(person.Address.City); // NullReferenceException, car Address == null\n\nComment trouver NullReferenceException : débogage pour débutants
\n\nQuand le programme plante, Visual Studio ou Rider afficheront la pile d'appels. Elle contiendra la ligne où l'erreur s'est produite. Mais souvent, le problème est plus profond. Voici un algorithme de recherche :
\n\n- \n
- Regardez la ligne avec l'erreur. Quelle variable y est utilisée ? Est-elle vraiment non null ? \n
- Vérifiez d'où vient la valeur. Si c'est le résultat d'une méthode — regardez si elle peut retourner null. \n
- Utilisez des points d'arrêt. Placez un breakpoint avant la ligne avec l'erreur et vérifiez les valeurs de toutes les variables. \n
- Ajoutez des points d'arrêt conditionnels. Dans Visual Studio, vous pouvez placer un breakpoint avec une condition :
myVar == null. \n
Comment corriger NullReferenceException : 5 méthodes éprouvées
\n\nBonne nouvelle : NullReferenceException peut presque toujours être évitée. Voici ce que vous pouvez faire.
\n\n1. Vérification de null (le bon vieux if)
\nif (name != null)\n{\n Console.WriteLine(name.Length);\n}\nelse\n{\n Console.WriteLine("Nom non défini");\n}\nCela fonctionne, mais rend le code lourd s'il y a beaucoup de vérifications