J'ai méthode compareObjects mis en œuvre comme ci-dessousQuelle est la bonne façon de mettre en œuvre compareObjects()
public static int compareObjects(Comparable a, Comparable b){
if (a == null && b == null){
return 0;
} else if (a == null && b != null){
return -1;
} else if (a != null && b == null){
return 1;
} else {
return a.compareTo(b);
}
}
Quand je lance ce par Findbugs, je reçois cette suggestion sur la ligne return a.compareTo(b)
:
Il est une branche de l'instruction qui, si elle est exécutée, garantit qu'une valeur nulle sera déréférencée, ce qui générerait une exception NullPointerException lorsque le code est exécuté. Bien sûr, le problème pourrait être que la branche ou l'instruction est infaisable et que l'exception du pointeur nul ne peut jamais être exécutée; décider qui est au-delà de la capacité de FindBugs. Du fait que cette valeur avait déjà été testée pour la nullité, ceci est une possibilité certaine.
À ce stade, a
ne peut jamais être nul. Pourquoi FindBugs me montre-t-il cette suggestion? Comment puis-je corriger cela? quelle est la bonne façon de mettre en œuvre compareObjects()
?
De la description, ça sonne comme il ne l'aime pas le fait que vous allez dire que les objets sont différents si l'on d'entre eux est null (IE return -1 si a == null, ce qui masque le fait que a == null). – Nicholas
Comparable est un type générique. Les paramètres de type A et B sont-ils les mêmes? Sinon, vous risquez d'avoir des erreurs intéressantes à l'exécution, puisque compareTo est uniquement destiné à être appelé sur des objets du même type. Aussi, pourquoi avez-vous besoin de cette méthode d'aide en premier lieu? Pour fournir un ordre quand un élément est nul? –
Les outils d'analyse statique ne sont pas infaillibles - ils peuvent et font parfois des faux positifs parfois –