2013-08-22 39 views
2

我使用Findbugs与eclipse整合。FIndbug不识别空指针异常

当我在我的项目上运行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识别此?

回答

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字段)除外。

+0

感谢您的答复! – prabu

+0

已将@Nonnull添加到我的代码中,但findbug仍然没有检测到NP :(已将jsr305-1.3.9.jar添加到eclipse classpath中。是否有任何建议? – prabu

+0

@prabu - 查看我的更新以了解为什么您不会收到错误警告。 –

0

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

+0

这是一个错字错误..在实际的代码中我有分号。对不起,错误.. – prabu

0

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

你可以在这里查看所有的空指针警告他们标有NP:http://findbugs.sourceforge.net/bugDescriptions.html

我认为这将导致在检测到错误的太大量这样的警告:带有参数的所有方法将给出参数警告这将在beeing测试之前使用。

+0

感谢您的回复:) – prabu

0

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