3

我有以下一段代码

 try{//do something
     }
  catch (Exception e) {
        log.error(e, e);
        if (e instanceof RuntimeException) {
            throw (RuntimeException) e;
        } else {
            throw new RuntimeException(e);
        }
    }

findbugs 静态分析工具会在其上抛出此警告

对于 methodX 中的所有非空值,instanceof 将始终返回 true,因为所有 RuntimeException 都是 RuntimeException 的实例

我不明白的是它的异常被捕获而不是RuntimeException,那么为什么会出现这个警告呢?

4

4 回答 4

6

也许,// do something代码不会抛出任何已检查的异常,因此您可以在 try 块中获得的唯一异常是未检查的异常(子类化RuntimeException)。

于 2012-05-23T10:00:39.783 回答
4

您也可以尝试以下代码。这将更好地阅读和维护。

try{//do something
}
catch (RuntimeException e) {
    throw e;
} 
catch (Exception e) {
    throw new RuntimeException(e);
}
于 2012-05-23T10:08:03.660 回答
2

可能没有在“尝试”部分抛出不 RuntimeException 的方法。因此,您可以使用构造

catch(RuntimeException e)
{
 //Do something
}
于 2012-05-23T10:04:05.490 回答
0

试试http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Throwables.html#propagate%28java.lang.Throwable%29。它完全符合您的要求。今天我出于同样的原因做了替换(findbugs警告),也查看了这个方法的来源。

于 2012-10-03T15:18:52.717 回答