Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 7精确重播和遗留代码_Java_Exception_Java 7_Rethrow - Fatal编程技术网

Java 7精确重播和遗留代码

Java 7精确重播和遗留代码,java,exception,java-7,rethrow,Java,Exception,Java 7,Rethrow,更精确的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

更精确的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;
     }
   }
我的问题:是否有一种工具允许检测不精确的抛出,以便将“
异常
”替换为“
第一异常,第二异常


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

在抛出之前尝试抛出异常,也许它会奏效

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

顺便说一句,对我来说,重新引用相同的异常似乎相当笨拙…

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

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

public void foo(String bar) throws Exception {
    // Code that may throw both FirstException and SecondException
}
在这里,
抛出异常
也可能被认为是不好的做法(但没有警告)

同样,请注意,当您试图捕获不可能抛出的(已检查的)异常时,将出现编译错误,但您可以将实现主体不使用的所有类型的异常添加到方法签名的
throws
子句中

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


更新:“除非方法是final或private”:我必须同意,对于private或final方法(也可能是静态方法),可能会有一个警告


更新2:即使对于最终方法,您也可能希望保留选项,以便将来在不破坏接口的情况下抛出更多异常。

关键是,在Java 7中,这不是必需的:您可以使用
throws FirstException,第二个例外
并使用一个简单的
抛出e
。我建议您在问题中添加以下句子:“我的目标是…”到目前为止,你还没有得到很好的建议,因为人们一直在猜测你的目标是错误的。我认为问题很清楚:为了更新那些懒散编写的遗留代码,从而引发过大的异常,是否有一个工具可以找到这样的代码,以便使用新的方便的Java7语法进行更新。