Comment fixer le Findbugs question “valeur Null est garanti d'être déréférencés” NP_GUARANTEED_DEREF
Salut j'ai un code qui est signalée comme ayant le NP_GUARANTEED_DEREF question par Findbugs.
Maintenant, en regardant mon code je ne comprends pas très bien ce qui est mal avec elle, quelqu'un peut-il suggérer que le problème est.
public void test() {
String var = "";
int index = 2;
if (index == -1) {
var = String.class.getName();
if (var.length() == 0) {
var = null;
}
} else {
var = Integer.class.getName();
if (var.length() == 0) {
var = null;
}
}
if (var == null) {//FINBUGS reports on this line NP_GUARANTEED_DEREF
/*
* There is a statement or branch that if executed guarantees that a value
* is null at this point, and that value that is guaranteed to be
* dereferenced (except on forward paths involving runtime exceptions).
*/
throw new NullPointerException("NULL");
}
}
Maintenant de forage dans l'Erreur en Findbugs il met en évidence les deux affectations à var = null;
comme cause pour le bug, mais je ne comprends pas très bien pourquoi. Ce n'est pas comme je suis en train de faire quelque chose avec le var
objet je me suis juste fait un Nul vérifier. L'exemple est tiré de la production réelle de code mais dépouillé de tout ce qui n'était pas nécessaire de reproduire l'erreur. Ce que je me demande si c'est un faux positif ou pas. Et si non, que serait un correctif approprié.
Voici le lien vers le Findbugs Bug Détail: http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF
[Mise à JOUR] Après avoir reçu quelques commentaires sur ce problème que j'ai maintenant connecté ce qu'un Faux Positif dans le Findbugs Bugtracker sur Sourceforge le lien est https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693
Conversation sur le problème va se poursuivre.
var.equals(null)
avant? Êtes-vous sûr que vous avez ré-exécuter Findbugs sur ce fichier (ce que je fais habituellement est que j'appelle le "nettoyer bug marqueurs").Oui, je suis sûr que j'ai réexécuter Findbugs, et non il n'a jamais été
var.equals(null)
si c'était qu'elle serait facilement compréhensible. Comme jzd a dit qu'il n'a pas l'air mal. Si je reçois confirmation de plus que cela n'a pas l'air mal, je vais probablement poster un Bug pour les (Faux positif), avec FindbugsJe vois. Je peux confirmer la même chose FB comportement sur mon ordinateur. Semble étrange en effet. Ce qui est drôle, que si vous avez remplacé
throw new NullPointerException
avec throw new RuntimeException
le bug marqueur disparaîtrait.Maintenant, je crois que je comprends ce qu'ils ont voulu dire. Le libellé du message n'est pas exact, mais ils mettent en garde contre un NPE. Je suppose qu'ils considèrent explicitement jeter NPE une mauvaise pratique.
ha intéressant de trouver Grzegorz, je peux confirmer votre trouver. C'est donc le NPE qui est le problème ici. Merci. Si vous mettez que dans une réelle réponse que je peux marquer que la réponse que je cherchais.
OriginalL'auteur AGrunewald | 2011-03-16
Vous devez vous connecter pour publier un commentaire.
Je vois. Je peux confirmer la même chose FB comportement sur mon ordinateur. Semble étrange en effet. Ce qui est drôle, que si vous avez remplacé
throw new NullPointerException
avecthrow new RuntimeException
le bug marqueur disparaîtrait.Maintenant, je crois que je comprends ce qu'ils ont voulu dire. Le libellé du message n'est pas exact, mais ils mettent en garde contre un NPE. Je suppose qu'ils considèrent explicitement jeter NPE une mauvaise pratique.
OriginalL'auteur Grzegorz Oledzki
C'est un bug dans FindBugs, poster cette question sur leur outil de suivi de la page. findbugs.sf.net
OriginalL'auteur MeBigFatGuy
OK, ce FindBugs est à la recherche d'un énoncé ou d'une branche qui est garanti pour conduire à une exception de pointeur null. À l'origine, nous ne cherchions déréférence de valeurs null. Plus tard, nous avons augmenté l'analyse pour traiter
if (x == null) throw new NullPointerException()
la même explicite de déréférencement de x. C'était principalement pour aider à interprocedural l'analyse, de sorte que les méthodes qui avaient explicite null vérifie leurs paramètres seraient traités de la même manière que les méthodes de déréférencement de leurs paramètres sans valeur null explicite des contrôles et des rapports d'erreurs lorsque les valeurs null sont passés pour de tels paramètres.
Donc une partie du texte dans nos messages d'erreur doivent être mis à jour, mais nous n'avons pas trouvé de nombreuses réaliste cas où il crée la confusion.
Je ne suis pas sûr que le but de ce code est. Au point où en êtes-vous affectation de la valeur null var, vous créez une situation qui va conduire à lancement explicite d'une exception de pointeur null. Est-ce vraiment le comportement que vous voulez?
OriginalL'auteur Bill
Regardant de plus près, dans la définition de la message d'erreur ici, il dit:
Qui me fait penser qu'il est juste en vous permettant de savoir var va être null ou quelque chose est en fait prise de findbugs pense que var est référencé à l'intérieur de l'instruction if.
Le code que vous avez posté l'air bien, je voudrais vérifier que la var n'est pas accessible dans le vrai code.
La seule chose que je peut changer est d'écrire le comparatif en arrière de la sorte:
De cette façon, il est évident que si vous laissez de côté l'un de l'
=
's/J'ai regardé la définition et la je me sens mieux dans ma réponse maintenant. J'ai mis à jour pour inclure la définition.
OriginalL'auteur jzd