Mise à jour
J'ai créé une bibliothèque java (dépendance Maven) pour que les développeurs java puissent supprimer cette NullPointerException Hell de leur code. Consultez mon dépôt.
Référentiel NullUtil
Méthode générique pour traiter les valeurs nulles en Java
<script src="https://gist.github.com/rcvaram/f1a1b89193baa1de39121386d5f865bc.js"></script>
-
Si cet objet n'est pas nul, nous allons faire les choses suivantes.
a. Nous pouvons muter l'objet (I)
b. Nous pouvons retourner quelque chose (O) comme sortie au lieu de muter l'objet (I).
c. nous pouvons faire les deux
Dans ce cas, nous devons passer une fonction qui doit prendre le paramètre d'entrée (I) qui est notre objet Si nous le prenons comme ça, alors nous pouvons muter cet objet si nous le voulons. et aussi cette fonction peut être quelque chose (O).
-
Si un objet est nul, nous allons faire les choses suivantes
a. Nous pouvons lancer une exception d'une manière personnalisée
b. Nous pouvons rendre quelque chose.
Dans ce cas, l'objet est nul, nous devons donc fournir la valeur ou nous devrons peut-être lever une exception.
Je prends deux exemples.
-
Si je veux exécuter une coupe dans une chaîne de caractères, cette chaîne ne doit pas être nulle. Dans ce cas, nous devons vérifier en plus la valeur nulle, sinon nous obtiendrons une NullPointerException.
public String trimValue(String s){
return s == null ? null : s.trim();
}
-
Une autre fonction pour laquelle je veux définir une nouvelle valeur pour un objet si cet objet n'est pas nul, sinon je veux lancer une exception d'exécution.
public void setTeacherAge(Teacher teacher, int age){
if (teacher != null){
teacher.setAge(age);
} else{
throw new RuntimeException("teacher is null")
}
}
Avec mon explication, j'ai créé une méthode générique qui prend la valeur (la valeur peut être nulle), une fonction qui s'exécutera si l'objet n'est pas nul et une autre fonction fournisseur qui s'exécutera si l'objet est nul.
Fonction générique
public <I, O> O setNullCheckExecutor(I value, Function<I, O> nonNullExecutor, Supplier<O> nullExecutor) {
return value != null ? nonNullExecutor.apply(value) : nullExecutor.get();
}
Donc après avoir eu cette fonction générique, nous pouvons faire comme suit pour les méthodes de l'exemple 1.
//To Trim a value
String trimmedValue = setNullCheckExecutor(value, String::trim, () -> null);
Ici, la fonction nonNullExecutorFunction coupe la valeur (la référence de la méthode est utilisée). La fonction nullExecutorFunction renvoie un résultat nul puisqu'il s'agit d'une fonction d'identité.
2.
// mutate the object if not null otherwise throw a custom message runtime exception instead of NullPointerException
setNullCheckExecutor(teacher, teacher -> {
teacher.setAge(19);
return null;
}, () -> {
throw new RuntimeException("Teacher is null");
});