当前位置: 首页 > 面试题库 >

通过将已检查的异常作为RuntimeException抛出可能会发生什么问题?

卢才艺
2023-03-14
问题内容

我有一段代码以JSON字符串编码某种业务数据:

public String encodeDataAsJsonString(Data data) throws JSONException {
    JSONObject o = new JSONObject();
    o.put("SomeField1", data.getSomeProperty1());
    o.put("SomeField2", data.getSomeProperty2());
    ...
    return o;
}

事情是:

  • JSONException是一个检查的异常,但是
  • 我真的不知道如何在编译时处理它。如果确实发生JSONException,则可能是代码中的错误,应该由 已经存在 的常规“全局未捕获异常处理程序” (例如this)来处理,并且已经执行了所有必要的日志记录和清理工作。

因此,我最终在调用方法中这样做:

...
try {
    encoded = encodeDataAsJsonString(data);
} catch (JSONException e) {
    throw new RuntimeException(e);
}
...

这似乎是不幸中之大幸不是添加throws JSONException每一个 方法调用堆栈。但是,它仍然感觉很脏,因此我的问题是:

如果我想让某些特定的已检查异常通过“常规未检查异常路由”,是否将其作为RuntimeException重新使用才是正确的习惯用法?


问题答案:

简短的回答,是的。

您可能会创建自己的异常类(运行时异常的子类),然后将其抛出,以使其更易于记录,在必要时捕获/处理它。像hibernate这样的事情通过使用HibernateException来实现,客户端/调用代码不是被强制捕获它,而是在可以完成特定于逻辑/应用程序的事情时始终可以捕获它。



 类似资料:
  • 根据JCIP第6.3.2节: Runnable是一个相当有限的抽象;run无法返回值或引发选中的异常。 无法返回值,因为其返回类型为void,但为什么不能引发选中的异常?

  • 该文件指出 Lambda函数可能由于以下任何原因而失败: 函数在尝试到达终结点时超时。 函数无法成功解析输入数据。 该函数会遇到资源限制,例如内存不足错误或其他超时。 我的问题:如果我使用SQS Lambda集成(.NET) 我的函数引发异常 我的SQS可见性计时器设置为15分钟,最大接收计数为1,DLQ设置 函数会重试吗?当所有重试后抛出异常时,它会放入DLQ吗?

  • 我注意到,在这个javadoc中,https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.htmlUncaughtExceptionHandler用于发生异常但未被捕获的情况。但是,那个线程会悄悄地失败吗?我想是的,因为它是异步进行业务的,但我正在调查我们的一个进程的相关问题,我很惊讶现

  • 考虑下面的java代码片段: 这在Eclipse(Neon.2,JDK 8)中实现,Sonarint执行静态代码分析。它提供了重构的建议: 重构此方法以引发最多一个已检查异常,而不是:java。lang.InstanceionException,java。lang.IllegalAccessException 这项建议的基础是什么最佳做法?我知道一般来说对检查异常有一些争议,但是为什么在这种情况下

  • 编译器知道检查的异常不能在安全方法内抛出-所以也许它应该允许只捕获未检查的异常? 回到主要问题--有没有理由以这种方式实现捕获检查异常?这仅仅是设计中的一个缺陷还是我遗漏了一些重要的因素--也许是向后的不兼容性?在此场景中,如果只允许捕获,可能会出现什么问题?实例非常感谢。

  • 下面是我的代码。当我运行它时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:3、Size:2中得到异常,而不是我的异常消息。谁能解释一下我做错了什么,为什么会这样?谢谢!