Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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 禁止捕获或抛出永远不会发生的异常?_Java_Exception Handling - Fatal编程技术网

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);
   }

}