La semana pasada, tuvimos una acalorada discusión sobre el manejo de nulos en la capa de servicio de nuestra aplicación. La pregunta está en el contexto .NET, pero será la misma en Java y en muchas otras tecnologías.
La pregunta era: ¿siempre debe verificar si hay nulos y hacer que su código funcione sin importar qué, o dejar que una excepción brote cuando se recibe un nulo inesperadamente?
Por un lado, verificar si es nulo donde no lo espera (es decir, no tener una interfaz de usuario para manejarlo) es, en mi opinión, lo mismo que escribir un bloque de prueba con captura vacía. Solo estás ocultando un error. El error puede ser que algo ha cambiado en el código y nulo es ahora un valor esperado, o hay algún otro error y se pasa la identificación incorrecta al método.
Por otro lado, verificar nulos puede ser un buen hábito en general. Además, si hay una comprobación, la aplicación puede seguir funcionando, y solo una pequeña parte de la funcionalidad no tendrá ningún efecto. Luego, el cliente puede informar un pequeño error como "no se puede eliminar el comentario" en lugar de un error mucho más grave como "no se puede abrir la página X".
¿Qué práctica sigues y cuáles son tus argumentos a favor o en contra de cualquier enfoque?
Actualizar:
Quiero agregar algunos detalles sobre nuestro caso particular. Estábamos recuperando algunos objetos de la base de datos e hicimos algún procesamiento en ellos (digamos, construir una colección). El desarrollador que escribió el código no anticipó que el objeto podría ser nulo, por lo que no incluyó ninguna verificación, y cuando se cargó la página hubo un error y no se cargó toda la página.
Obviamente, en este caso debería haber habido un cheque. Luego nos pusimos en una discusión sobre si cada objeto que se procesa debe verificarse, incluso si no se espera que falte, y si el procesamiento final debe abortarse en silencio.
El beneficio hipotético sería que la página continuará funcionando. Piense en los resultados de una búsqueda en Stack Exchange en diferentes grupos (usuarios, comentarios, preguntas). El método podría verificar nulo y anular el procesamiento de los usuarios (que debido a un error es nulo) pero devolver las secciones de "comentarios" y "preguntas". La página continuaría funcionando, excepto que faltará la sección "usuarios" (que es un error). ¿Deberíamos fallar temprano y romper toda la página o continuar trabajando y esperar a que alguien note que falta la sección "usuarios"?
assert(foo != null, "foo is web control within the repeater, there's no reason to expect it to be null, etc, etc...");