2010-11-02 21 views
1

Quand je lance ce par Findbugs, je reçois un avertissement:Comment utiliser @CheckForNull etc avec Findbugs?

static @NonNull Object foo(@CheckForNull Object arg) { 
    if (arg == null) { // warning on this line 
     throw new NullPointerException(); 
    } 
    return "something"; 

} 

Les détails de l'avertissement est le suivant:

Bug: arg doit être non nulle mais est marqué comme annulable
Motif id: NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE, tapez: NP, catégorie: STYLE

Ce paramètre est toujours utilisé d'une manière qui nécessite d'être nonnu ll, mais le paramètre est explicitement annoté comme étant Nullable. L'utilisation du paramètre ou de l'annotation est incorrecte.

Quelqu'un peut-il expliquer ce à quoi Findbugs se plaint ici? Notez que j'utilise les membres edu.umd.cs.findbugs.annotations.*, pas le javax.annotations.* (Y at-il une différence?)

La mise en place est FindBugs plug-in 1.3.9.2009- pour Eclipse 3.6.1.


Matthew Flaschen a suggéré que je l'utilise à la place @NonNull, mais maintenant je suis tombé sur ce problème:

static void blah(@NonNull Object arg) { 
    if (arg == null) { 
     throw new NullPointerException(); 
    } 
    System.out.println(arg); 
} 

static @CheckForNull Object bleh() { 
    return null; 
} 

//... 
blah(bleh()); // warning here! 

Les détails de l'avertissement est:

Bug: pointeur NULL possible déréférencer en raison de la valeur de retour de la méthode appelée
Numéro de modèle: NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE, tapez: NP, catégorie: STYLE

La valeur de retour d'une méthode est déréférencée sans vérification null, et la valeur de retour de cette méthode doit généralement être vérifiée pour null. Cela peut conduire à NullPointerException lorsque le code est exécuté.

Je veux essentiellement blah pour satisfaire à l'exigence @CheckForNull, mais je ne peux pas le faire si je fais son arg être @NonNull. Comment puis-je faire fonctionner ça?

Répondre

5

Vous vous contredisez. CheckForNull signifie, "L'élément annoté peut être nul", mais si c'est vous jetez immédiatement.

Si ce n'est jamais acceptable pour un appelant de passer null, je crois que vous devriez plutôt annoter:

static @NonNull Object foo(@NonNull Object arg) { 
+0

N'annoter comme '@ NonNull' causer un problème lorsque vous comparez avec' arg == null' parce que Findbugs pense que c'est inutile? – polygenelubricants

+1

@poly, non, j'ai testé. Il avertit uniquement lorsque vous marquez le paramètre 'CheckForNull'. Il n'accepte aucune annotation ou 'NonNull'. Cela a du sens, puisque 'NonNull' ne s'applique pas seul. –