我正在使用与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识别出来?
答案 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在你的类路径中......