Estoy seguro de que todos hemos recibido la excepción maravillosamente vaga "Referencia de objeto no configurada como instancia de un objeto" en algún momento u otro. Identificar el objeto que es el problema es a menudo una tarea tediosa de establecer puntos de interrupción e inspeccionar todos los miembros en cada declaración.
¿Alguien tiene algún truco para identificar de manera fácil y eficiente el objeto que causa la excepción, ya sea mediante programación o de otra manera?
--editar
Parece que fui vago como la excepción =). El punto es _no tener que depurar la aplicación para encontrar el objeto errante. El compilador/tiempo de ejecución sabe que el objeto se ha asignado/declarado y que aún no se ha creado una instancia del objeto. ¿Hay alguna manera de extraer/identificar esos detalles en una excepción detectada?
@ W. Craig Comerciante
Su explicación de que es el resultado de un problema de diseño es probablemente la mejor respuesta que pude obtener. Soy bastante compulsivo con la codificación defensiva y he logrado deshacerme de la mayoría de estos errores después de corregir mis hábitos con el tiempo. Los restantes simplemente me modifican sin fin y me llevan a publicar esta pregunta en la comunidad.
Gracias por las sugerencias de todos.
Solución del problema
En el punto donde se lanza el NRE, no hay ningún objeto de destino, ese es el punto de la excepción. Lo máximo que puede esperar es atrapar el archivo y el número de línea donde ocurrió la excepción. Si tiene problemas para identificar qué referencia de objeto está causando el problema, es posible que desee reconsiderar sus estándares de codificación, ya que parece que está haciendo demasiado en una línea de código.
Una mejor solución para este tipo de problema es el diseño por contrato, ya sea a través de construcciones de lenguaje incorporadas o mediante una biblioteca. DbC sugeriría verificar previamente cualquier argumento entrante para un método para datos fuera de rango (es decir, nulo) y lanzar excepciones porque el método no funcionará con datos incorrectos.
[Editar para coincidir con la pregunta de edición:]
Creo que la descripción de NRE te está engañando. El problema que tiene CLR es que se le pidió que desreferenciara una referencia de objeto, cuando la referencia de objeto es nula. Toma este programa de ejemplo:
public class NullPointerExample {
public static void Main()
{
Object foo;
System.Console.WriteLine( foo.ToString() );
}
}
Cuando ejecute esto, arrojará un NRE en la línea 5, cuando intentó evaluar el método ToString() en foo. No hay objetos para depurar, solo una referencia de objeto sin inicializar (foo). Hay una clase y un método, pero ningún objeto.
Re: Respuesta de Chris Marasti-Georg:
Nunca debe lanzar NRE usted mismo; esa es una excepción del sistema con un significado específico: CLR (o JVM) ha intentado evaluar una referencia de objeto que no se inicializó. Si verifica previamente una referencia de objeto, entonces arroje algún tipo de excepción de argumento no válido o una excepción específica de la aplicación, pero no NRE, porque solo confundirá al próximo programador que tiene que mantener su aplicación.
No hay comentarios:
Publicar un comentario