Java 禁止捕获或抛出永远不会发生的异常?
假设我在方法中有以下行:Java 禁止捕获或抛出永远不会发生的异常?,java,exception-handling,Java,Exception Handling,假设我在方法中有以下行: String encodedString = URLEncoder.encode(foo, "utf-8"); 此方法引发一个不受支持的编码异常。哪一个更好: /** @throws UnsupportedEncodingException umm...never */ public void myMethod() throws UnsupportedEncodingException { ... String encodedString = URLE
String encodedString = URLEncoder.encode(foo, "utf-8");
此方法引发一个不受支持的编码异常
。哪一个更好:
/** @throws UnsupportedEncodingException umm...never
*/
public void myMethod() throws UnsupportedEncodingException {
...
String encodedString = URLEncoder.encode(foo, "utf-8");
...
}
(强迫打电话的人自己接听)或:
或者有没有一种更优雅的方法来处理永远不会发生的异常?如果你能很好地保证永远不会发生异常,那么最好将这个断言定位在最窄的范围内,而不是让它传播,因为其他人可能不看文档就不会意识到这一点
如果一个方法被声明抛出某个东西,那么应该有它实际抛出的场景。如果几乎可以保证永远不会这样做,那么最好完全省略throws
子句并简化API
您应该始终抛出适合您的抽象级别的异常(有效Java第二版,第61项)。宣称你可能会扔东西,但却保证不会发生,这违反了这个设计准则。永远不要说不;)
在上面的示例中,您始终可以捕获异常,然后抛出RuntimeException:
public void myMethod() {
try {
...
String encodedString = URLEncoder.encode(foo, "utf-8");
...
} catch(UnsupportedEncodingException e) {
throw new RuntimeException("This should not be possible",e);
}
}
这样一来,打电话的人就不会被迫去捕捉那些你99.999%肯定永远不会发生的事情,但在这种疯狂的事情发生时,你仍然会得到一个异常气泡,你希望在这个时候能注意到它,并能很快意识到发生了什么变化并加以修复
HTH这两个答案都很好,但我之所以接受这一点,是因为RuntimeException的想法非常好。也许一个非法状态异常在这里是有意义的…另一种可能是
抛出新的断言错误(“这不可能发生”,ex)
@StephenC,这比运行时好吗?是的。使用catch(异常e)
不会意外捕获它。
public void myMethod() {
try {
...
String encodedString = URLEncoder.encode(foo, "utf-8");
...
} catch(UnsupportedEncodingException e) {
throw new RuntimeException("This should not be possible",e);
}
}