Na semana passada, tivemos uma discussão acalorada sobre como lidar com nulos na camada de serviço de nosso aplicativo. A questão está no contexto do .NET, mas será a mesma em Java e em muitas outras tecnologias.
A pergunta era: você deve sempre verificar nulos e fazer com que seu código funcione, não importa o quê, ou deixar uma exceção surgir quando um nulo é recebido inesperadamente?
Por um lado, verificar nulo onde você não o espera (ou seja, não possui interface com o usuário para lidar com isso) é, na minha opinião, o mesmo que escrever um bloco try com catch vazio. Você está apenas ocultando um erro. O erro pode ser que algo mudou no código e nulo agora é um valor esperado, ou há algum outro erro e o ID errado é passado para o método.
Por outro lado, verificar nulos pode ser um bom hábito em geral. Além disso, se houver uma verificação, o aplicativo poderá continuar funcionando, com apenas uma pequena parte da funcionalidade sem efeito. Em seguida, o cliente pode relatar um pequeno bug como "não é possível excluir o comentário" em vez de um bug muito mais grave como "não é possível abrir a página X".
Que prática você segue e quais são seus argumentos a favor ou contra qualquer uma dessas abordagens?
Atualizar:
Quero acrescentar alguns detalhes sobre o nosso caso em particular. Estávamos recuperando alguns objetos do banco de dados e fizemos algum processamento neles (digamos, construímos uma coleção). O desenvolvedor que escreveu o código não previu que o objeto pudesse ser nulo, portanto não incluiu nenhuma verificação e, quando a página foi carregada, ocorreu um erro e a página inteira não foi carregada.
Obviamente, nesse caso, deveria ter havido um cheque. Em seguida, discutimos se todos os objetos processados devem ser verificados, mesmo que não se espere que eles estejam ausentes, e se o processamento final deve ser interrompido silenciosamente.
O benefício hipotético seria que a página continuasse funcionando. Pense nos resultados de uma pesquisa no Stack Exchange em diferentes grupos (usuários, comentários, perguntas). O método pode verificar se há nulo e abortar o processamento de usuários (que devido a um erro é nulo), mas retornar as seções "comentários" e "perguntas". A página continuaria funcionando, exceto que a seção "usuários" estará ausente (o que é um bug). Devemos falhar cedo e quebrar a página inteira ou continuar a trabalhar e esperar que alguém note que a seção "usuários" está ausente?
assert(foo != null, "foo is web control within the repeater, there's no reason to expect it to be null, etc, etc...");