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 pournull
. 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?
N'annoter comme '@ NonNull' causer un problème lorsque vous comparez avec' arg == null' parce que Findbugs pense que c'est inutile? – polygenelubricants
@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. –