java - 如何修复 Findbugs 问题 "Null value is guaranteed to be dereferenced"NP_GUARANTEED_DEREF

标签 java nullpointerexception findbugs dereference correctness

您好,我有一些代码被 Findbugs 报告为具有 NP_GUARANTEED_DEREF 问题。 现在看我的代码我不太明白它有什么问题,任何人都可以提出问题所在。

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");
  }
}

现在深入研究 Findbugs 中的错误,它突出显示了对 var = null; 的两个赋值作为错误的原因,但我不太明白为什么。我实际上并没有对 var 对象做任何事情,我只是在做 Null 检查。该示例取自真实的生产代码,但删除了重现错误不需要的任何内容。我想知道这是否是误报。如果不是,什么是适当的修复。

这是 Findbugs 错误详细信息的链接:http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF

[更新] 在收到关于此问题的一些反馈后,我现在已将此作为误报记录在 Sourceforge 上的 Findbugs Bugtracker 中,链接是 https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693

关于问题的对话将在那里继续。

最佳答案

我明白了。我可以在我的计算机上确认相同的 FB 行为。看起来确实很奇怪。有趣的是,如果您将 throw new NullPointerException 替换为 throw new RuntimeException,错误标记就会消失。

现在我想我明白他们的意思了。消息的措辞不准确,但它们警告您不要使用 NPE。我猜他们认为明确抛出 NPE 是一种不好的做法。

关于java - 如何修复 Findbugs 问题 "Null value is guaranteed to be dereferenced"NP_GUARANTEED_DEREF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5329036/

相关文章:

java - 如何阻止 findbugs-maven-plugin 验证 querydsl 生成的类

java - AndroidX Work Library 正在取消操作,看似没有原因

java - 将对象数组转换为泛型数组

java - Mac OS X 上的 JNI 链接时出现 undefined symbol 错误

java - 在编写 if-else 编译器时会报错,但为了简写它不会报错,为什么?

java - Findbugs 不排除我们的 Java 应用程序中的方法

sonarqube - Sonar findbugs 堆大小

java - 多次动画翻译后将 Android View 保持在新位置?

java - 我在 Struts 2 中有一个 NullPointerException 报告

java - 使用链表实现队列时出现 NullPointerException