更精确的重新抛出允许编写抛出真正抛出的异常的代码:
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/