Question

Salut j'ai obtenu un code qui est rapporté comme ayant la question NP_GUARANTEED_DEREF par Findbugs. Vous voyez maintenant mon code, je ne comprends pas tout à fait ce qui est mal avec elle, peut-on penser 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");
  }
}

forage dans l'erreur dans Findbugs il met en évidence les deux missions à var = null; comme cause du bug, mais je ne comprends pas pourquoi. Il est pas comme je fais quoi que ce soit avec l'objet var que je fais un chèque de Null. L'exemple est tiré du vrai code de production, mais dépouillé de tout ce qui n'a pas été nécessaire pour reproduire l'erreur. Ce que je me demande si cela est un faux positif ou non. Et sinon ce serait une solution appropriée.

Voici le lien vers le détail Bug Findbugs: http://findbugs.sourceforge.net/ bugDescriptions.html # NP_GUARANTEED_DEREF

[UPDATE] Après recieving des commentaires sur cette question, je suis maintenant connecté cela comme 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 continuera là.

Était-ce utile?

La solution

Je vois. Je peux confirmer le même comportement de FB sur mon ordinateur. On dirait étrange. Ce qui est drôle, que si vous remplacez throw new NullPointerException avec throw new RuntimeException le marqueur bug disparaîtrait.

Maintenant, je pense que je comprends ce qu'ils ont voulu dire. Le libellé du message n'est pas exact, mais ils vous en garde contre un NPE. Je suppose qu'ils considèrent jeter explicitement NPE une mauvaise pratique.

Autres conseils

Il est un bogue dans FindBugs, poster cette question sur leur problème page suivi. findbugs.sf.net

OK, ce FindBugs cherche est une déclaration ou une branche qui est garanti pour conduire à une exception de pointeur NULL. A l'origine, nous ne cherchions déréférencement des valeurs nulles. Nous avons augmenté plus tard l'analyse à traiter

if (x == null) throw new NullPointerException()

identique à un déréférencement explicite de x. Ce fut d'abord à l'aide d'analyse interprocédurale, de sorte que les méthodes qui avaient des contrôles nuls explicites pour leurs paramètres seraient traités comme des méthodes qui déréférencer leurs paramètres sans contrôle nuls explicites, et les erreurs de rapport lorsque les valeurs nulles sont transmises pour de tels paramètres.

une partie du texte dans nos msgs d'erreur peut être mis à jour, mais nous avons vraiment pas trouvé beaucoup de cas réalistes où il est source de confusion.

Je ne suis pas tout à fait sûr de ce que le but du code ci-dessus est. Aux points où vous attribuez null à var, vous créez une situation qui conduira à un jet explicite d'une exception de pointeur NULL plus bas. Est-ce vraiment le comportement que vous voulez?

regardant de plus près dans la définition du message d'erreur , il dit:

Il y a une déclaration ou une branche si exécutées garantit qu'une valeur est nulle en ce point, et que la valeur qui est garanti déréférencé (Sauf sur les chemins à terme sur exceptions d'exécution)

Ce qui me fait penser qu'il est soit juste vous faire savoir var va être nulle ou quelque chose est en fait findbugs font penser que var est référencé dans l'instruction if.

Le code affiché semble bien, je vérifier que var est pas accessible dans le code vrai.

La seule chose que je pourrais changer est d'écrire les arrière de sorte comparision comme:

if (null == var)

De cette façon, il est évident si vous laissez l'un des = est /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top