¿Qué es NullReferenceException y cómo combatirlo? Guía completa para desarrolladores de C#
\n\n¿Alguna vez ha visto ese temido mensaje: "Object reference not set to an instance of an object"? Si escribe en C# aunque sea una semana, seguro que se ha topado con él. Esto es NullReferenceException, el error más popular en el mundo .NET. Asusta a los principiantes, pero los desarrolladores experimentados saben que es solo la forma que tiene el programa de decir: "No sé con qué trabajar, dame un objeto".
\n\nEn este artículo, analizaremos por qué ocurre NullReferenceException, cómo encontrarlo y, lo más importante, cómo prevenirlo. Aprenderá a escribir código más seguro y a dedicar menos tiempo a la depuración.
\n\n¿Qué es NullReferenceException en palabras sencillas?
\n\nImagine que pidió una pizza y el repartidor llega con las manos vacías. Usted pregunta: "¿Dónde está mi pizza?" y él responde: "No sé, no tengo nada". Así funciona más o menos NullReferenceException. Intenta llamar a un método o acceder a una propiedad de una variable que es igual a null. El compilador no lo ve, pero durante la ejecución el programa falla.
En C#, cualquier variable de referencia (clase, interfaz, cadena, arreglo) puede ser null. Si intenta hacer algo con esa variable, obtendrá una excepción.
Los escenarios más comunes de aparición de NullReferenceException
\n\nVeamos ejemplos reales de código que provocan este error.
\n\n1. Variable no inicializada
\nstring name;\nConsole.WriteLine(name.Length); // NullReferenceException\nLa variable name está declarada pero no inicializada. Por defecto, es igual a null.
2. Método que devuelve null
\npublic string GetUserName(int id)\n{\n // si el usuario no se encuentra, devolvemos null\n return null;\n}\n\nvar user = GetUserName(42);\nConsole.WriteLine(user.ToUpper()); // NullReferenceException\n\n3. Acceso a un elemento de colección que no existe
\nvar list = new List<string> { "A", "B" };\nvar item = list[5]; // ArgumentOutOfRangeException, pero si el elemento fuera null...\n// Y un ejemplo con Dictionary:\nvar dict = new Dictionary<int, string>();\nvar value = dict[1]; // KeyNotFoundException, pero si la clave existiera y el valor fuera null?\n\n4. Cadena de llamadas
\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, porque Address == null\n\nCómo encontrar NullReferenceException: depuración para principiantes
\n\nCuando el programa falla, Visual Studio o Rider mostrarán la pila de llamadas. Allí estará la línea donde ocurrió el error. Pero a menudo el problema es más profundo. Aquí tiene un algoritmo de búsqueda:
\n\n- \n
- Mire la línea con el error. ¿Qué variable se usa allí? ¿Está segura de que no es null? \n
- Verifique de dónde proviene el valor. Si es el resultado de un método, compruebe si puede devolver null. \n
- Use puntos de interrupción. Coloque un breakpoint antes de la línea con el error y verifique los valores de todas las variables. \n
- Agregue puntos de interrupción condicionales. En Visual Studio puede poner un breakpoint con una condición:
myVar == null. \n
Cómo corregir NullReferenceException: 5 formas comprobadas
\n\nLa buena noticia: NullReferenceException casi siempre se puede prevenir. Esto es lo que puede hacer.
\n\n1. Comprobación de null (el clásico if)
\nif (name != null)\n{\n Console.WriteLine(name.Length);\n}\nelse\n{\n Console.WriteLine("Nombre no establecido");\n}\nEsto funciona, pero hace que el código sea voluminoso si hay muchas comprobaciones