【问题标题】:Is this a bug of findbugs?这是 findbugs 的错误吗?
【发布时间】:2017-04-22 07:22:57
【问题描述】:

我有一个包含如下代码的 jenkins 插件:

public int getLastBuildNumber() {
    if (project != null && project.getLastBuild() != null ) {
        return project.getLastBuild().getNumber();
    }
    return 0;
}

当我使用 mvn release:prepare release:perform -Dusername=myusername -Dpassword=mypassword 发布代码时,我遇到了一个错误,提示 Possible null pointer dereference

这是mvn findbugs:gui的结果:

为什么说The return value from a method is dereferenced without a null check

我认为project != null && project.getLastBuild() != null 是空检查,不是吗?

这是 findbugs 的错误吗?我该如何解决?或者我可以在发布我的 jenkins 插件时禁用 findbugs 吗?

您可以访问here获取完整代码。

【问题讨论】:

  • 将此问题移至 meta.stackexchange.com... 抱歉,开个玩笑! :)

标签: maven jenkins findbugs


【解决方案1】:

除非您的 Project 类是不可变的,或者(至少)getLastBuild() 返回的值是 final 字段,否则您的空值检查是不够的。

这是因为,理论上,其他线程可能会在您的 return 语句之前调用 project.setLastBuild(null)

if (project != null && project.getLastBuild() != null) {
    // thread T does project.setLastBuild(null) here -- for whatever reason
    return project.getLastBuild().getNumber(); // NPE!
}

要做到这一点,您需要远离那些移动部件并制作自己的本地副本(在这种情况下同步几乎不是一种选择,恕我直言):

LastBuild lastBuild = project != null ? project.getLastBuild() : null; // this only works as long as your project reference is final
return lastBuild != null ? lastBuild.getNumber() : 0;

或者,更好的是,使用 Java8 Optional 一次性执行所有必要的空值检查(隐式):

return Optional.ofNullable(project)
    .map(Project::getLastBuild)
    .map(LastBuild::getNumber)
    .orElse(0);

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 2012-03-18
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多