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

Java何时选择已检查和未检查的异常

慕俊语
2023-03-14
问题内容

在Java(或任何其他具有检查的异常的语言)中,当创建自己的异常类时,如何决定应检查还是不检查它?

我的直觉是,在调用者能够以某种有效的方式进行恢复的情况下,将要求使用检查异常,而对于无法恢复的情况,未检查异常将更多,但是我会对其他人的想法感兴趣。


问题答案:

只要你知道何时应使用检查异常,它就很棒。Java核心API未能遵循SQLException(有时甚至是IOException)的这些规则,这就是它们如此糟糕的原因。

检查异常应该用于预测的,但不可预防是错误的合理歇着。

未经检查的异常应用于其他所有内容。

我将为你详细说明这一点,因为大多数人都误解了这意味着什么。

可预测但无法预防:调用方在力所能及的范围内竭尽所能来验证输入参数,但其控制范围之外的某些情况导致操作失败。例如,你尝试读取文件,但是在你检查文件是否存在与读取操作开始之间有人将其删除。通过声明一个检查的异常,你可以告诉调用者预期该失败。
合理地恢复:没有任何必要告诉呼叫者预见他们无法恢复的异常。如果用户尝试从不存在的文件中读取,则调用者可以提示他们输入新的文件名。另一方面,如果该方法由于编程错误(无效的方法参数或错误的方法实现)而失败,则应用程序无法采取任何措施来解决执行中的问题。最好的办法是记录问题并等待开发人员稍后解决。
除非你抛出的异常满足以上所有条件,否则应使用Unchecked Exception。

在每个级别进行重新评估:有时,捕获已检查异常的方法不是处理错误的正确位置。在这种情况下,请考虑对你自己的呼叫者而言合理的选择。如果异常是可预测的,无法预防的并且使它们恢复正常,那么你应该自己抛出一个检查的异常。如果不是,则应将异常包装在未经检查的异常中。如果遵循此规则,你会发现自己将检查的异常转换为未检查的异常,反之亦然,具体取决于你所在的层。

对于已检查和未检查的异常,请使用正确的抽象级别。例如,具有两个不同实现(数据库和文件系统)的代码存储库应避免通过抛出SQLException或公开特定于实现的细节IOException。相反,它应该将异常包装在涵盖所有实现的抽象中(例如RepositoryException)。



 类似资料:
  • 问题内容: 我在理解Java 和异常之间的区别时遇到了一些问题。 首先,异常应该在编译时寻找异常。在不同来源中提供的示例引用了数据库连接性,其中一些是文件处理,而异常应该是在程序员方面寻找错误,例如索引超出数组范围等。 不应该反过来吗?我的意思是,数据库连接是在运行时完成的,对吧?文件处理也是如此。您没有在编译时打开文件句柄,那么为什么在编译时会寻找一个可能的错误呢?另一方面,超出数组范围的索引已

  • 问题内容: 阅读本书中的 Exception时,我发现了以下语句: 被检查的异常由编译器在编译时检查。 和 编译器不会在编译时检查未经检查的异常。 因此,如果我们也可以说或 位于Checked Exceptions类树之下。如何将java编译器知道 会有 一个例外,没有对 其中 可能 仍然 代码为我的理解里面。 另外,强制捕获Checked异常而不是Unchecked意味着什么呢? 问题答案: J

  • 问题内容: 据我了解,如果不逐一查找API文档,就无法找出方法抛出的异常。 由于这是没有选择的,因此我想撤消研究,并询问您在处理时遇到的最常见的Exception和RuntimeException: 铸件 数组 向量,ArrayList,HashMap等 IO(文件类,流,过滤器…) 对象序列化 线程(wait(),sleep()等) 或任何其他被视为“基本Java”的内容 我意识到这可能是主观的

  • 我有以下两个示例,我不清楚java.lang.Exception是如何处理的:作为检查的或未检查的异常。 以下方法编译成功: 在这里,我认为java.lang.Exception是威胁java.lang.RuntimeException或java.lang.Error。不处理也可以声明扔。 如果我们没有使用异常,而是使用了检查异常(它是java.lang.Exception的子类),那么您必须在方

  • 问题内容: 我一直在阅读有关未解决问题和已解决问题的信息,没有一个在线资源真正了解它们之间的区别以及何时使用两者。 据我了解,它们都在运行时抛出,它们都表示超出逻辑预期范围的程序状态,但是必须显式捕获已检查的异常,而未检查的异常则不能。 我的问题是,假设出于参数考虑,我有一个将两个数字相除的方法 以及需要在某处划分的方法 谁负责检查分母为零的情况,应该检查还是取消检查异常(忽略Java的内置div

  • 问题内容: 什么是运行时异常?什么是“检查/未检查”异常以及“错误/异常”之间的区别?为什么有这么多类型?相反,Java可能仅遵循简单的设计(仅尝试/捕获所有类型)来处理程序中的异常情况? 问题答案: Throwable是所有异常的重中之重。在Throwable下面,您有Error和Exception。在异常下,您具有RuntimeException。 Java有两种类型的异常- 已检查和未检查。