我怎样才能让 Eclipse(或 javac)警告过度包容的 throws 条款

How can I make Eclipse (or javac) warn about over-inclusive throws clauses

我正在处理一个项目(其他人的代码),其中一个方法被声明为抛出一堆它不可能抛出的已检查异常。

基本上,该方法如下所示:

// Assume E1 extends Exception
// Assume E2 extends Exception
// Assume E3 extends Exception
public void method(Object param) throws E1, E2, E3 {
    // Call a bunch of methods, none of which are declared to
    // throw checked exceptions.
}

当然,我删除了throws子句。当然,我这样做没有收到任何编译器错误,因为根据代码的静态分析,抛出这些异常是不可能的。

所以我的问题是,为什么 Eclipse 及其构建器或 javac 没有警告我这些虚假的 throws 声明?有什么我可以开启的东西吗?

最糟糕的是,如果我 得到了我应该得到的警告,就会产生级联效应,因为 method() 的所有调用者要么重新声明相同的 throws 或包含一堆无用的 try/catch 块,这绝对混淆了程序的含义。

不幸的是,这实际上会打断下游用户,而且 Eclipse 找到所有这些用户的成本可能高得令人望而却步。

部分问题在于

try {
  cantThrowFooException();
} catch (FooException e) {
  // whatever
}
如果 javac 确定不会抛出 FooException

将不会编译。因此,从方法的 throws 子句中删除 FooException 可以使编译器证明 FooException 没有被抛入下游的 try 块中,结果将是编译失败。

如果 throws 子句中包含不必要的异常,您可以强制 Eclipse 给出编译时间 error/warning。

请参考以下截图:

因为方法不是最终的,我认为它是非最终的 class 的一部分。因此它可以被抛出这些异常的另一种方法覆盖。

如果您更改了问题,使方法或其 class 成为最终方法,那么您会遇到另一个有趣的问题。