我有以下代码的findbugs错误,
if( obj instanceof CustomerData )
{
CustomerData customerData = (CustomerData)obj;
if (customerData == null)
{
errors.reject("Error", "Null data received");
}
}
错误描述:
obj的冗余nullcheck,已知为非null(包名和方法名称,我因安全违规而删除)
此方法包含对常量null的已知非空值的冗余检查。
请告诉我这里的错误是什么。
答案 0 :(得分:11)
instanceof
, null
将返回false。所以你不需要再检查。
答案 1 :(得分:3)
我在下面添加了评论内容......
根据this,instanceof
会为false
个实例返回null
。
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");
}
}
答案 2 :(得分:1)
显然obj
在特定检查的上下文中不能为空。 Findbugs可以告诉并警告您删除还原剂检查。除非您向我们提供声明/定义obj
的源代码,否则我们无法为您提供更多帮助。
那就是说,Findbugs的错误/警告不一定是个问题。在这种情况下,例如,如果您认为将来可能需要进行检查,则可以忽略该警告。一个常见的情况是在测试期间硬编码输入对象以测试特定的代码路径,但为了安全起见,您仍需要在生产中进行空检查。
编辑(编辑问题后):
好吧,null instanceof <Whatever>
始终为false,因此代码中的instanceof
条件确保obj
不能为空。在这种情况下,你可能想要删除空检查 - 这是多余的,Findbugs做得很好指出来......