Wie kann man die Findbugs Thema "Null-Wert garantiert ist, aufgelöst werden" NP_GUARANTEED_DEREF
Hallo ich habe einige code, wird gemeldet, dass die NP_GUARANTEED_DEREF Ausgabe von Findbugs.
Nun ein Blick auf mein code, den ich nicht ganz verstehen, was ist falsch mit ihm, kann jeder jeden schlagen, was das problem ist.
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");
}
}
Nun die Bohrung in der Fehler in Findbugs es betont die zwei Aufgaben zu var = null;
als Ursache für den Fehler, aber ich verstehe nicht ganz, warum. Es ist nicht so, ich bin tatsächlich etwas zu tun mit der var
Objekt bin ich gerade dabei ein Null-check. Das Beispiel stammt aus dem echten Produktions-code, aber ohne, dass etwas war nicht erforderlich, den Fehler zu reproduzieren. Was ich mich Frage, ob dies ein false-positive ist oder nicht. Und wenn nicht, was wäre eine angemessene Korrektur.
Hier ist der link zu dem Findbugs Bug Detail: http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF
[UPDATE] Nach Erhalt ein feedback über dieses Problem habe ich nun angemeldet, dies als False Positive in die Findbugs Bugtracker auf Sourceforge, der link ist https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693
Gespräch über das problem wird weiterhin da.
var.equals(null)
vor? Sind Sie sicher, dass Sie re-run Findbugs auf die Datei (was ich normalerweise tun ist, nenne ich das "sauber bug-Marker").Ja, ich bin sicher, dass ich erneut Findbugs, und Nein es war nie
var.equals(null)
wenn es war, dass es einfach nachvollziehbar ist. Als jzd sagte, es sieht nicht falsch. Wenn ich mehr Bestätigung, dass es nicht falsch Aussehen, werde ich wahrscheinlich nach einem Fehler (False positive) mit FindbugsIch sehe. Kann ich bestätigen, die gleiche FB-Verhalten auf meinem computer. Sieht schon seltsam. Was komisch ist, dass wenn Sie ersetzt
throw new NullPointerException
mit throw new RuntimeException
der Fehler-marker verschwinden würden.Nun ich denke ich verstehe, was Sie gemeint habe. Der Wortlaut der Nachricht ist nicht exakt, aber Sie sind Warnung Sie gegen eine NPE. Ich vermute, Sie betrachten explizit wirft NPE eine schlechte Praxis ist.
ha interessant finden, Grzegorz, ich kann bestätigen, Ihre finden. So ist es die NPE, dass ist das Problem hier. Danke. Wenn Sie setzen, dass in einer tatsächlichen Antwort kann ich markieren Sie es als die Antwort, die ich suchte.
InformationsquelleAutor AGrunewald | 2011-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich. Kann ich bestätigen, die gleiche FB-Verhalten auf meinem computer. Sieht schon seltsam. Was komisch ist, dass wenn Sie ersetzt
throw new NullPointerException
mitthrow new RuntimeException
der Fehler-marker verschwinden würden.Nun ich denke ich verstehe, was Sie gemeint habe. Der Wortlaut der Nachricht ist nicht exakt, aber Sie sind Warnung Sie gegen eine NPE. Ich vermute, Sie betrachten explizit wirft NPE eine schlechte Praxis ist.
InformationsquelleAutor Grzegorz Oledzki
Es ist ein Fehler in FindBugs, post, dieses Problem auf Ihre issue-tracker-Seite. findbugs.sf.net
InformationsquelleAutor MeBigFatGuy
OK, was FindBugs sucht, ist eine Anweisung oder Verzweigung gewährleistet ist, führen zu einer null-Zeiger-Ausnahme. Ursprünglich hatten wir nur nach Begriffen dereferenziert von null-Werten. Wir später erhöhten die Analyse zu behandeln
if (x == null) throw new NullPointerException()
das gleiche wie eine explizite Dereferenzierung von x an. Dies war in Erster Linie zu helfen, interprozedurale Analyse, so dass Methoden, die hatte explizite null-checks für Ihre Parameter würden genauso behandelt wie Methoden, die Dereferenzierung Ihre Parameter ohne explizite null-Prüfungen durch und meldet Fehler, wenn null-Werte übergeben werden, die für solche Parameter.
So dass einige der text in unserer Fehler-msg-Befehle müssen möglicherweise aktualisiert werden, aber noch nicht wirklich gefunden, vielen realistischen Fällen, in denen es zu Verwirrung.
Ich bin mir nicht ganz sicher, was der Zweck der obige code ist. An den Punkten, wo Sie durch das zuweisen von null auf var, erstellen Sie eine situation, die zu einer expliziten auslösen einer null-Zeiger-Ausnahme weiter unten. Ist das wirklich das Verhalten, das Sie wollen?
InformationsquelleAutor Bill
Werfen wir einen Blick in die definition der Fehlermeldung hier, es sagt:
Das macht mich denke, es ist entweder nur lassen Sie wissen var wird zu null oder etwas tatsächlich macht findbugs denke, dass var referenziert wird innerhalb der if-Anweisung.
Den code, den Sie geschrieben sieht gut aus, ich würde überprüfen Sie, dass var nicht zugegriffen wird, in der wahren code.
Das einzige, was ich ändern kann ist zu schreiben, den Vergleich nach hinten etwa so:
So ist es offensichtlich, wenn man eine der
=
's/Ich schaute auf die definition und ich fühle mich besser über meine Antwort nun. Ich habe aktualisiert es um die definition.
InformationsquelleAutor jzd