繁体   English   中英

已检查与未检查的异常

[英]Checked vs Unchecked exception

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

这是什么意思?

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

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

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

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

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

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

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

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

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

这是因为,

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

检查以下链接:

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

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

**检查异常

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

未经检查的异常

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

简单来说,

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM