2011-07-13 11 views
5

Iは、以下のコードのためにFindBugsのエラーを有するAM、FindBugsの - 冗長比較がNULLに

if(obj instanceof CustomerData) 
{ 
    CustomerData customerData = (CustomerData)obj; 

    if (customerData == null) 
    { 
     errors.reject("Error", "Null data received"); 
    } 
} 

エラーDESC:非ヌルであることが知られているOBJの

冗長nullcheck、(パッケージとメソッド名、セキュリティ違反のために削除しました)

このメソッドには、既知のnull以外の値が定数nullに対して冗長チェックされています。

ここでエラーが何かをお知らせください。

+1

エラーから、私は 'CustomerData customerData =(CustomerData)obj;例外は 'obj'がnullのため、この' if(customerData == null) 'が冗長である(または上記のコードは' obj'が 'not null 'であることを明確にします)。 – forsvarir

+0

"if condition"コードを追加しました。 – Srinivasan

答えて

11

instanceof引数がnull場合はfalseを返します。だから、別の小切手は必要ありません。

3

私はnull例えば、falseを返しinstanceofthisによると...下記のインライン

を、コメントを追加しました。

if(obj instanceof CustomerData) 
{ 

    /* To get here, obj must be a non-null instance of CustomerData, 
    * so the following cast will always succeed and result in a non-null 
    * customerData 
    */ 

    CustomerData customerData = (CustomerData)obj; 

    /* customerData cannot be null because of the conditions above, so 
    * this check is pointless (it'll never be triggered 
    */ 

    if (customerData == null) 
    { 
     /* This line cannot be reached, because of the conditions above */ 
     errors.reject("Error", "Null data received"); 
    } 
} 
1

明らかに、objは、その特定のチェックのコンテキストではnullにできません。 Findbugsは通知することができます。 objが宣言されている/定義されているソースコードを私たちに提供している場合を除き、私たちはあなたにもっとお手伝いすることはできません。

しかし、Findbugsのエラー/警告は必ずしも問題ではありません。この場合、たとえば、将来的に検査が必要かもしれないと感じる場合は、警告を無視することができます。一般的なケースは、特定のコードパスをテストするために入力オブジェクトをハードコードするテスト中ですが、安全のために引き続き生産時にヌルチェックが必要です。 (質問編集後)

EDIT:

まあ、null instanceof <Whatever>は常に偽であるので、あなたのコード内の条件付きinstanceofobjはnullにすることはできませんことを保証します。この場合、おそらくヌルチェックを削除する必要があります。余計なことですが、Findbugsはそれを指摘することができました。