【问题标题】:Findbugs BC_UNCONFIRMED_CAST warningFindbugs BC_UNCONFIRMED_CAST 警告
【发布时间】:2014-03-28 20:09:06
【问题描述】:

我有两门课 -

class A {}
class B extends A {}

而我正在这样做 -

A a = new B();
if(a instanceof B){
   doSomething((B) a); // type case a to B
}

doSomething 方法看起来像这样 -

public void doSomething(B b) { .. }

Findbugs 在上述代码中没有发出警告。但是如果我像这样更改上面的代码 -

class A {
   public boolean isOfTypeB() {
      return this instanceof B;
   }
}
class B extends A {}

A a = new B();
if(a.isOfTypeB()){
  doSomething((B) a); // BC_UNCONFIRMED_CAST warning
}

Findbugs 引发错误 BC_UNCONFIRMED_CAST。我认为这两种实现方式没有太大区别。有什么建议吗,我有什么遗漏吗?

【问题讨论】:

  • 错误是在 if(a.isOfTypeB()) 行还是在 doSomething((B) a) 上引发的?
  • 它是在 doSomething((B) a) 行上提出的。更新了问题
  • 很可能是findbug无法判断方法调用isOfTypeB是instanceof检查。
  • 是的,findbugs 似乎不支持它 - osdir.com/ml/java.findbugs.general/2006-12/msg00014.html
  • 警告在 this 的情况下是正确的,因为isOfTypeB() 不是final。可以用例如覆盖它return true;.

标签: java findbugs


【解决方案1】:

FindBugs 在checkcast 字节码之前查找instanceof。您可以使用assert 来取悦 FindBugs 警告和代码的未来维护者。

A a = new B();
if (a.isOfTypeB()){
  assert a instanceof B : a.getClass(); //Safe to call getClass because 'a' is non-null.
  doSomething((B) a);
}

在 FindBugs 3.0 之前,您可以使用动态转换来解决此警告。不要这样做,因为它会在更高版本的 FindBugs 中检测到。

A a = new B();
if (a.isOfTypeB()) {
  doSomething(B.class.cast(a));
}

要考虑的一件事是 FindBugs 检测确实会产生实际错误的模式和可以产生实际错误的模式。 'instanceof' 关键字和 Class.cast 行为不能被覆盖,但 'isTypeOfB' 可以被覆盖。即使 FindBugs 没有检测到您的代码示例和我的代码示例都按预期运行,也可能警告是正确的,因为建议不要这样做。

【讨论】:

    【解决方案2】:

    对于那些希望将 ServletResponse 转换为 HttpServletResponse 的用户,请使用 instanceof,如下所示。

    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {       
    
            if (response instanceof HttpServletResponse)
                noCaching((HttpServletResponse) response);
    
            chain.doFilter(request, response);
        }
    

    BC_UNCONFIRMED_CAST 错误不会在 findbugs 报告中报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2016-11-02
      • 1970-01-01
      相关资源
      最近更新 更多