Uma parte do meu programa busca dados de muitas tabelas e colunas no meu banco de dados para processamento. Algumas das colunas podem estar null
, mas no contexto de processamento atual, isso é um erro.
Isso "teoricamente" não deve acontecer, portanto, se isso ocorrer, ele indica dados incorretos ou um bug no código. Os erros têm gravidades diferentes, dependendo de qual campo é null
; ou seja, para alguns campos o processamento deve ser interrompido e alguém notificado, para outros o processamento deve continuar e apenas notificar alguém.
Existem bons princípios de arquitetura ou design para lidar com as null
entradas raras, mas possíveis ?
As soluções devem ser possíveis de implementar com Java, mas eu não usei a tag porque acho que o problema é um pouco independente da linguagem.
Alguns pensamentos que eu tinha:
Usando NOT NULL
O mais fácil seria usar uma restrição NOT NULL no banco de dados.
Mas e se a inserção original dos dados for mais importante que esta etapa de processamento posterior? Portanto, caso a inserção coloque um null
na tabela (por causa de bugs ou talvez por algum motivo válido), eu não gostaria que a inserção falhasse. Digamos que muitas outras partes do programa dependam dos dados inseridos, mas não dessa coluna em particular. Portanto, prefiro arriscar o erro na etapa de processamento atual em vez da etapa de inserção. É por isso que não quero usar uma restrição NOT NULL.
Ingenuamente, dependendo de NullPointerException
Eu poderia apenas usar os dados como se esperasse que eles estivessem sempre lá (e esse deveria realmente ser o caso) e capturar os NPEs resultantes em um nível apropriado (por exemplo, para que o processamento da entrada atual pare, mas não todo o progresso do processamento ) Esse é o princípio do "falhar rápido" e eu geralmente prefiro. Se for um bug, pelo menos, recebo um NPE registrado.
Mas, então, perco a capacidade de diferenciar entre vários tipos de dados ausentes. Por exemplo, para alguns dados ausentes, eu poderia deixar de fora, mas para outros, o processamento deve ser interrompido e um administrador notificado.
Verificando null
antes de cada acesso e lançando exceções personalizadas
Exceções personalizadas me permitem decidir a ação correta com base na exceção, portanto esse parece ser o caminho a seguir.
Mas e se eu esquecer de verificar em algum lugar? Além disso, desorganizo meu código com verificações nulas que nunca ou raramente são esperadas (e, portanto, definitivamente não fazem parte do fluxo da lógica de negócios).
Se eu optar por seguir esse caminho, quais padrões são mais adequados para a abordagem?
Quaisquer pensamentos e comentários sobre minhas abordagens são bem-vindos. Também melhores soluções de qualquer tipo (padrões, princípios, melhor arquitetura do meu código ou modelos etc.).
Editar:
Há outra restrição: eu estou usando um ORM para fazer o mapeamento do banco de dados para o objeto de persistência, portanto, fazer verificações nulas nesse nível não funcionaria (como os mesmos objetos são usados em partes em que o nulo não causa nenhum dano) . Eu adicionei isso porque as respostas fornecidas até agora mencionaram essa opção.