11

我研究过:但是,对于未经检查的异常,编译器不会强制客户端程序员捕获异常或在 throws 子句中声明它。事实上,客户端程序员甚至可能不知道异常可能会被抛出。例如,由 String 的方法StringIndexOutOfBoundsException抛出。charAt()

这是什么意思?

根据该代码,无需将 try catch 块放入代码中,但我已经看到编译器强制将代码放入 try catch 块中。

我很困惑他们到底是什么?

4

7 回答 7

27

未经检查的异常是扩展RuntimeException类的异常。编译器永远不会强迫您捕获此类异常或强迫您在使用throws关键字的方法中声明它。检查所有其他异常类型(不扩展RuntimeException),因此必须声明为被抛出和/或捕获。

当您希望方法的调用者(即 API 的用户)显式处理 API 中的异常情况时,使用检查的异常。当您认为调用能够对这种异常情况执行一些有意义的事情时,就会声明检查的异常,例如重试调用、回滚更改或将其转换为一些用户可读的错误消息。

如果您认为该调用对异常没有任何用处(尤其是当它表示错误或 API 的错误使用时),则应取消选中该异常。此外,带有太多已检查异常的 API 可能会令人讨厌(例如,尝试使用 java 反射 API=)

于 2011-01-09T14:03:44.963 回答
8
  • Checked Exceptions 对于处理程序正常操作中发生的事件很有用。一个例子IOException是当文件无法打开时抛出的。即使程序没有任何问题,也会发生这些异常。因此,有必要告诉程序如何处理异常。
  • 未经检查的异常对于识别代码中的缺陷很有用。例如,在对象NullPointerException上读取值时抛出 a 。null因此,未经检查的异常表示需要程序员手动修复的问题。为了避免错误行为,程序崩溃是合理的,因此不需要 try-catch 块(但可能需要提供缓解措施,例如向用户显示错误)。
于 2017-05-22T18:54:22.517 回答
4

你的问题到底是什么?编译器不应该(也不会)强制您尝试/捕获未经检查的异常,这将违背它们的本质。

一般的想法是,检查的异常是您可以预见的,但可能基于您无法控制且您必须处理的输入。未经检查的异常通常代表程序中的错误。

有很多人认为检查异常在 Java 平台中是一个错误,他们只是非常谨慎地使用它们或根本不使用它们。你可以通过搜索谷歌阅读更多关于这场辩论的信息。

于 2011-01-09T13:42:13.490 回答
3

这是因为,

  1. 未经检查的异常不是程序员错误的结果。相反,它们是我们(程序员)不希望对其做太多事情的严重后果。
  2. 对于Checked Exception,是由于程序员的错误而产生的异常,通常可以由程序员自己解决。

检查以下链接:

为什么未选中运行时异常?
已检查与未检查的异常?

于 2011-01-29T13:56:37.860 回答
1

所有异常都是运行时间的一部分,而不是编译时间。有两种异常检查异常和未检查异常。已检查异常的示例是 IO 异常、ClassNotFound 异常,未检查异常的示例是运行时异常。在检查异常的情况下,错误或警告消息在编译时出现,以便用户在运行时使用 throws 关键字处理它,该关键字用于将异常抛出到默认的 catch 机制系统。但是如果出现未经检查的异常,编译时不会出现警告。

于 2020-04-23T18:56:23.450 回答
0

**检查异常

在编写代码期间要检查或处理或应注意的异常称为已检查异常。例如: 1. 我们有 FileNotFoundException --> 当我们编写一些与文件类相关的代码时会发生这种情况。绝对有文件不存在的可能性。在这种情况下,为了处理它们,我们肯定会被迫处理这些异常。2. 还有一个例子是 ParseException ,它会在我们处理日期函数时发生。

未经检查的异常

这些是在编码期间可选处理的异常。是否处理它们取决于我们。如果我们未能处理它们,则在执行期间有可能出现运行时错误。例如:我们有一个叫做 NullPointerException、ArithemeticException、NosSuchElementFoundException 等的东西。这些就像我们甚至不必处理它们的可选事物。甚至 jvm 或编译器也不建议我们处理它们。**

于 2019-10-16T07:10:01.710 回答
0

简单来说,

  • 已检查异常是那些可以并且应该由您的代码处理的异常(因此编译器会强制您处理它们)
  • 未经检查的异常是超出程序员控制范围的异常(因此编译器不会强迫您处理它们)

即使在创建自定义例外时也使用相同的规则。

于 2021-06-05T14:56:46.700 回答