Java™ 教程(捕获或指定要求)

捕获或指定要求

有效的Java编程语言代码必须遵守捕获或指定需求,这意味着可能抛出某些异常的代码必须包含以下任一项:

  • 捕获异常的 try
    语句, try
    必须为异常提供处理程序,如捕获和处理异常中所述。
  • 一种方法,指定它可以抛出异常,该方法必须提供一个 throws
    子句,列出异常,如通过方法抛出异常中所述。

不符合捕获或指定要求的代码将无法编译

并非所有异常都受捕获或指定要求的约束,为了理解原因,我们需要查看三个基本类别的异常,其中只有一个受要求限制。

三种异常

第一种异常是已检查的异常,这些都是编写良好的应用程序应该预料到并从中恢复的异常情况。例如,假设应用程序提示用户输入文件名,然后通过将名称传递给 java.io.FileReader
的构造函数来打开该文件,通常,用户提供现有可读文件的名称,因此 FileReader
构造对象成功,并且应用程序的执行正常进行。但有时用户提供不存在的文件的名称,构造函数抛出 java.io.FileNotFoundException
,一个编写良好的程序将捕获此异常并通知用户该错误,可能提示更正的文件名。

已检查的异常情况受捕获或指定要求的约束,除 Error
RuntimeException
及其子类表示的异常外,所有异常都是经过检查的异常。

第二种异常是错误,这些是应用程序外部的异常情况,应用程序通常无法预测或恢复。例如,假设应用程序对于输入成功打开文件,但由于硬件或系统故障而无法读取文件,不成功的读取将抛出 java.io.IOError
,应用程序可能会选择捕获此异常,以便通知用户该问题 — 但是程序打印堆栈跟踪并退出也可能有意义。

错误不受捕获或指定要求的约束,错误是 Error
及其子类表示的异常。

第三种异常是运行时异常,这些是应用程序内部的异常情况,应用程序通常无法预测或恢复,这些通常表示编程bug,例如逻辑错误或API的不当使用。例如,考虑前面描述的应用程序将文件名传递给 FileReader
的构造函数,如果逻辑错误导致将 null
传递给构造函数,则构造函数将抛出 NullPointerException
,应用程序可以捕获此异常,但消除导致异常发生的bug可能更有意义。

运行时异常不受捕获或指定要求的约束,运行时异常是 RuntimeException
及其子类表示的异常。

错误和运行时异常统称为未经检查的异常。

绕过捕获或指定

一些程序员认为捕获或指定要求是异常机制中的一个严重缺陷,并通过使用未经检查的异常代替已检查的异常来绕过它,通常,不建议这样做,未经检查的异常 — 争议部分讨论何时适合使用未经检查的异常。

上一篇:什么是异常?

原文 

https://segmentfault.com/a/1190000018737788

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java™ 教程(捕获或指定要求)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址