3

我正在使用与 Eclipse 集成的 Findbugs。

当我在我的项目上运行 findbugs 时,没有为可能的空指针异常捕获以下代码。

在下面的代码片段中,对象测试容易出现空指针异常,findbugs 无法识别。

@Override
    public boolean saveIrr(TestObject test) throws DuplicateRecordException {
        boolean status = false
        try {
            test.getAddDate();
            status = adhocMaintPopupMapper.saveIrr(IRRPopupMaint);
        } catch (DataIntegrityViolationException e) {
            logger.error("Error in Saving!", e);
            throw new TransactionDataException("Error in Saving!", e);
        }
        return status;
    }

是否需要进行任何配置更改才能使 findbugs 识别这一点?

4

4 回答 4

4

如果您添加@Nonnull到参数声明中,FindBugs 将突出显示您传递未检查值的任何位置null。如果您标记它@CheckForNull,FindBugs 将突出显示您访问它的方法中的任何位置,而无需检查null

你做什么取决于方法的合同:它是否容忍null?查看它的实现,它不允许在null不引发意外异常的情况下进行。因此,test应该进行标记@Nonnull,以便您可以发现不正确的呼叫。

更新

FindBugs只会@Nonnull检查使用或注释的字段、参数、方法返回值@CheckForNull。假设任何没有注释的东西都会@Nullable告诉 FindBugs 忽略它。

public boolean saveIrr(@Nonnull TestObject test) { ... }

public void dontCareAboutNull(TestObject value) {
    saveIrr(value); // no bug
}

public void mightBeNull(@CheckForNull TestObject value) {
    saveIrr(value); // bug
}

出于这个原因,我们@Nonnull在包级别适用于所有三种类型的值。任何需要允许的值都null必须用 注释@CheckForNull。我们不允许@Nullable在极少数极端情况下使用 except(例如@AutowiredSpring 强制执行的字段)。

于 2013-08-23T02:54:42.693 回答
0

我注意到你缺少一个 ; 在“boolean status = false”之后的代码中,这可能是 findbug 解析代码时出现问题的原因。

于 2013-08-22T06:33:20.417 回答
0

好吧,据我了解:您想确定该测试尚未进行空值测试。据我所知,没有办法为此配置 findbugs。Findbugs 可以在其他 2 种情况下警告您: - NP_ARGUMENT_MIGHT_BE_NULL :如果您调用您的方法 saveIrr 并使用之前未测试过 null 的参数。- NP_NULL_INSTANCEOF :如果 findbug 确定您的值在某一点上保证为空。

您可以在此处检查所有用 NP 标识的空指针警告:http: //findbugs.sourceforge.net/bugDescriptions.html

我认为这样的警告会导致检测到过多的错误:所有带有参数的方法都会对在测试之前使用的参数发出警告。

于 2013-08-22T07:46:41.520 回答
0

你可以做的是使用findbugs/jsr305 的注解因此,如果您将 @Nullable 添加到 TestObject 中的 getDate() 方法中,它可能会触发 NP 警告。如果您想使用这些注释,请确保 jsr305.jar 在您的类路径中...

于 2013-08-22T15:05:16.757 回答