2011-08-30 3 views
0

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()?

+0

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

+0

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? –

+0

Les outils d'analyse statique ne sont pas infaillibles - ils peuvent et font parfois des faux positifs parfois –

Répondre

1

je pense que ce pourrait être parce que vous ne avez pas besoin des & & supplémentaires déclarations. Après la première instruction if, vous savez déjà que l'un d'entre eux est nul.

public static int compareObjects(Comparable a, Comparable b){ 

    if (a == null && b == null){ 
     return 0; 
    } else if (a == null){ 
     return -1; 
    } else if (b == null){ 
     return 1; 
    } else { 
     return a.compareTo(b); 
    } 
} 
1

Il peut s'agir d'une limitation dans FindBugs; Je suis d'accord que vous avez couvert toutes les bases, mais votre vérification de null est divisé en deux conditions différentes. Maintenant, ces conditions sont complémentaires, donc au moins l'une d'entre elles se déclenchera si a est nulle, mais en fonction de la sophistication de FindBugs, il peut ne pas le reconnaître.

deux options, puis:

  1. ignorer l'avertissement FindBugs. En raison de sa nature va soulever quelques faux positifs de temps en temps, donc ne vous sentez pas comme vous devez réécrire votre code pour le rendre 100% heureux si vous ne pensez pas que la réécriture est valable sur ses propres mérites.

    Vous pouvez utiliser le @SuppressWarnings annotation pour communiquer cela à FindBugs, si vous voulez que le rapport affiche un gros zéro à la fin. Voir this question pour un exemple.

  2. Restructurer la condition pour que le contrôle de nullité sur a est plus explicite, par emboîtement if blocs:

    if (a == null) { 
        return b == null ? 0 : -1; 
    } 
    return b == null ? 1 : a.compareTo(b); 
    

    Selon vos goûts et le style qui pourrait être une meilleure réécrivons de toute façon, en ce sens est plus clairement dit "si a est nul, faites ce calcul et le retourner, sinon faire ce calcul". Vous pouvez bien sûr changer la condition ternaire dans un autre bloc if-else si vous préférez cela.

+0

Merci Andrzej, oui il est inutile de réécrire mon code pour rendre findBugs 100% heureux :) J'aime votre déclaration. – javanerd

1

regardant à nouveau, essayez ce code:

if (a == null && b == null){ 
    return 0; 
} 

if (a == null){ 
    return -1; 
} 

if (b == null){ 
    return 1; 
} 

return a.compareTo(b); 
Questions connexes