NullReferenceException en C#: cómo encontrar y corregir el error

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿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\n

En 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\n

Imagine 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.

\n\n

En C#, cualquier variable de referencia (clase, interfaz, cadena, arreglo) puede ser null. Si intenta hacer algo con esa variable, obtendrá una excepción.

\n\n

Los escenarios más comunes de aparición de NullReferenceException

\n\n

Veamos ejemplos reales de código que provocan este error.

\n\n

1. Variable no inicializada

\n
string name;\nConsole.WriteLine(name.Length); // NullReferenceException
\n

La variable name está declarada pero no inicializada. Por defecto, es igual a null.

\n\n

2. Método que devuelve null

\n
public 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\n

3. Acceso a un elemento de colección que no existe

\n
var 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\n

4. Cadena de llamadas

\n
class 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\n

Cómo encontrar NullReferenceException: depuración para principiantes

\n\n

Cuando 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
\n\n

Cómo corregir NullReferenceException: 5 formas comprobadas

\n\n

La buena noticia: NullReferenceException casi siempre se puede prevenir. Esto es lo que puede hacer.

\n\n

1. Comprobación de null (el clásico if)

\n
if (name != null)\n{\n    Console.WriteLine(name.Length);\n}\nelse\n{\n    Console.WriteLine("Nombre no establecido");\n}
\n

Esto funciona, pero hace que el código sea voluminoso si hay muchas comprobaciones

Blogs

Book Recommendations