FIndbug没有识别空指针异常

时间:2013-08-22 06:14:41

标签: java nullpointerexception findbugs

我正在使用与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 个答案:

答案 0 :(得分:3)

如果将@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,除非极少数极端情况(例如Spring强制执行的@Autowired字段)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据我的理解,您可以确定:您希望确定该测试未针对null进行测试。据我所知,没有办法配置findbugs这样做。 Findbugs可以在另外两种情况下警告你: - NP_ARGUMENT_MIGHT_BE_NULL:如果你调用你的方法saveIrr,并且之前没有测试过null的参数。 - NP_NULL_INSTANCEOF:如果findbug确定您的值在某一点上保证为空。

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

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

答案 3 :(得分:0)

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