Java 7 精确重抛和遗留代码

标签 java exception java-7 rethrow

更精确的重新抛出允许编写抛出真正抛出的异常的代码:

   public void foo(String bar) throws FirstException, SecondException {
     try{
       // Code that may throw both FirstException and SecondException
     }
     catch (Exception e){
       throw e;
     }
   }

在 Java 7 之前,您必须编写:

   public void foo(String bar) throws Exception {
     try{
       // Code that may throw both FirstException and SecondException
     }
     catch (Exception e){
       throw e;
     }
   }

我的问题:是否有一种工具可以检测不精确的抛出,以便将“Exception”替换为“FirstException, SecondException” ?

到目前为止,我已经检查过 Eclipse 中没有编译器警告。 FindBugs 或 CodePro 中没有规则。

最佳答案

我认为这不是编译器警告的情况,因为“过于宽泛”的异常不一定是问题:除非方法是 final 或私有(private)的,否则它定义了任何子类实现可以抛出什么样的异常。在那种情况下,广泛的范围可能是有意的。

您的问题同样适用于 Java pre-7:

public void foo(String bar) throws Exception {
    // Code that may throw both FirstException and SecondException
}

在这里,throws Exception 也可以被认为是不好的做法(但没有关于它的警告)。

沿着同一行参数,请注意,当您 try catch 不可能抛出的(已检查)异常时,您将得到一个编译错误,但您可以添加到 throws 方法签名的子句实现主体不使用的各种异常。

不过,像 FindBugs 这样的工具会很有用。


更新:“除非该方法是最终的或私有(private)的”:我必须同意对于私有(private)或最终的方法(也可能是静态方法)可能会有警告。

更新 2:即使对于 final 方法,您也可能希望保留您的选项以在将来抛出更多异常而不破坏接口(interface)。

关于Java 7 精确重抛和遗留代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8077726/

相关文章:

linux - SpringBoot 应用程序在一小时后停止。

java - JVM 在 Lucene DataInput.readVInt 上崩溃

java - 为什么 Throwable.fillInStackTrace() 方法是公开的?为什么有人会使用它?

java - Android Google Geolocation api 返回 403 错误

java - 同步映射或同步方法

java - 让用户选择包含内容的目录

c++ - 符号可见性,异常,运行时错误

linux - u-boot中的异常向量地址

java - 推荐用于 Swing 应用程序或替代库的通用 CSS 引擎

java - 从外观上使用标准按钮