更精确的重新抛出允许编写抛出异常抛出的异常的代码:
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中没有规则。
答案 0 :(得分:1)
我认为这不是编译器警告的情况,因为“过于宽泛”的异常不一定是个问题:除非方法是final或private,否则它定义了任何子类实现可以抛出的异常类型。在这种情况下,广泛的范围可能是故意的。
您的问题同样适用于Java pre-7:
public void foo(String bar) throws Exception {
// Code that may throw both FirstException and SecondException
}
在这里,throws Exception
也可能被视为不良做法(但没有任何警告)。
沿着相同的论点,请注意,当您尝试捕获无法抛出的(已检查)异常时,您将收到编译错误,但您可以添加到{{1方法签名的子句,实现主体不使用的各种异常。
像FindBugs这样的工具会很有用。
更新:“除非方法是最终的或私有的”:我必须同意,对于私人或最终方法(也可能是静态方法),可能会有警告。
更新2:即使对于最终方法,您可能希望将选项保持打开状态,以便将来抛出更多例外而不会破坏界面。
答案 1 :(得分:-2)
尝试在抛出前抛出异常,也许它会起作用?
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);
}
}
顺便说一句,重新抛出同样的异常对我来说似乎很笨拙......