Une partie de mon programme récupère les données de nombreuses tables et colonnes dans ma base de données pour le traitement. Certaines colonnes peuvent l'être null
, mais dans le contexte de traitement actuel, c'est une erreur.
Cela ne devrait "théoriquement" pas se produire, donc s'il le fait, cela indique des données incorrectes ou un bogue dans le code. Les erreurs ont différentes gravités, selon le champ null
; c'est-à-dire que pour certains champs, le traitement doit être interrompu et que quelqu'un doit en être informé, pour d'autres, le traitement doit être autorisé à se poursuivre et simplement informer quelqu'un.
Existe-t-il de bons principes d'architecture ou de conception pour gérer les null
entrées rares mais possibles ?
Les solutions devraient être possibles à implémenter avec Java mais je n'ai pas utilisé la balise car je pense que le problème est quelque peu indépendant du langage.
Quelques pensées que j'avais moi-même:
Utilisation de NOT NULL
Le plus simple serait d'utiliser une contrainte NOT NULL dans la base de données.
Mais que se passe-t-il si l'insertion originale des données est plus importante que cette étape de traitement ultérieure? Donc, dans le cas où l'insertion mettrait un null
dans la table (soit à cause de bogues, soit d'une raison valable), je ne voudrais pas que l'insertion échoue. Disons que de nombreuses autres parties du programme dépendent des données insérées, mais pas de cette colonne particulière. Je préfère donc risquer l'erreur dans l'étape de traitement actuelle au lieu de l'étape d'insertion. C'est pourquoi je ne veux pas utiliser de contrainte NOT NULL.
Naïvement dépendant de NullPointerException
Je pourrais simplement utiliser les données comme si je m'attendais à ce qu'elles soient toujours là (et cela devrait vraiment être le cas), et attraper les NPE résultants à un niveau approprié (par exemple pour que le traitement de l'entrée actuelle s'arrête mais pas la progression du traitement dans son ensemble) ). C'est le principe du «fail fast» et je le préfère souvent. S'il s'agit d'un bogue au moins, j'obtiens un NPE enregistré.
Mais je perds alors la capacité de différencier les différents types de données manquantes. Par exemple, pour certaines données manquantes, je pourrais les laisser de côté, mais pour d'autres, le traitement devrait être arrêté et un administrateur notifié.
Vérification null
avant chaque accès et levée d'exceptions personnalisées
Les exceptions personnalisées me permettraient de décider de l'action correcte en fonction de l'exception, donc cela semble être la voie à suivre.
Mais si j'oublie de le vérifier quelque part? De plus, j'encombre ensuite mon code avec des contrôles nuls qui ne sont jamais ou rarement attendus (et qui ne font donc certainement pas partie du flux de logique métier).
Si je choisis cette voie, quels modèles conviennent le mieux à l'approche?
Toutes les réflexions et commentaires sur mes approches sont les bienvenus. Aussi de meilleures solutions de toute nature (modèles, principes, meilleure architecture de mon code ou modèles, etc.).
Éditer:
Il y a une autre contrainte, en ce que j'utilise un ORM pour faire le mappage de la base de données à l'objet de persistance, donc faire des vérifications nulles à ce niveau ne fonctionnerait pas (car les mêmes objets sont utilisés dans des parties où le null ne fait aucun mal) . J'ai ajouté cela parce que les réponses fournies jusqu'à présent mentionnaient toutes deux cette option.