有时,我最终不得不捕获一个我知道永远不会发生的异常,比如这里
URLDecoder.decode("some string", "UTF-8"); //No unknown encoding possible
或者在这里:
public void methodWithURL(URL url){
URI uri = new URI(url); //No invalud URI syntax possible
}
你是怎么处理这个问题的?我通常会记录一个关于宇宙法则如何改变的有趣错误,然后抛出一个RuntimeException
。有没有更好的方法?
发布于 2012-07-02 16:42:24
我会跳过有趣的留言。
顺便说一句:我遇到过这样的情况,一段代码(在一个小的库中)只是假设一个编码是可用的。只是它被部署在一个有限的设备上,并在运行时爆炸。
检查异常用于显示代码中我们应该暂停一秒钟的地方,并考虑较少经过的路径(如“我的应用程序在网络崩溃时会做什么”和其他转折点情况)。将它们包装在IllegalStateException中并重新抛出是一种签署的合同,程序员说:“是的,考虑到所有风险,我对这里的位置承担全部责任”。如果不是因为检查异常,我们就无法从缺乏思考的情况下知道一个明智的决定。
发布于 2016-04-20 15:10:05
以下是我的解决方案--为Android开发的,但可以很容易地改编为“常规”Java:
public class ImpossibleException extends RuntimeException {
public ImpossibleException(@NonNull String whyNotPossible) {
this(whyNotPossible, null);
}
public ImpossibleException(@NonNull String whyNotPossible, Throwable throwable) {
super("Impossible exception: " + whyNotPossible, throwable);
Log.e("Impossible", whyNotPossible, throwable);
}
}
用法:
try {
byte[] data = "Hello".getBytes("utf-8");
Log.i("Test", "data.length=" + data.length);
} catch (UnsupportedEncodingException e) {
throw new ImpossibleException("Android always supports utf-8", e);
}
whyNotPossible
构造函数意味着不需要在发生错误的地方记录错误,也不需要注释。
我猜这是一个口味问题,如果这应该是一个ImpossibleException extends RuntimeException
或ImpossibleError extends Error
。
发布于 2021-01-16 04:58:50
如果你在你的项目中使用Lombok,你可以用@SneakyThrows
注释周围的方法,这类方法在RuntimeException
中隐藏了检查过的异常(因此不需要用try-catch
包围,也不需要在throws
子句中声明它)。
例如:
@SneakyThrows(URISyntaxException.class)
public void methodWithURL(URL url){ // No throws here
URI uri = new URI(url); // Assume no invalud URI syntax possible
}
https://stackoverflow.com/questions/11289943
复制相似问题