2013-08-22 62 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位於您的類路徑中...