一、什么是Exception
术语异常是短语“异常事件”的缩写
定义:异常是在程序执行期间发生的事件,它中断程序指令的正常流动。
当方法中发生错误时,该方法创建一个对象并将其传递给运行时系统。该对象称为异常对象,包含有关错误的信息,包括其类型和发生错误时程序的状态。创建异常对象并将其传递给运行时系统称为引发异常。
在方法抛出异常后,运行时系统试图找到一些东西来处理它。处理异常的可能“somethings”集合是已调用以到达发生错误的方法的有序方法列表。方法列表称为调用堆栈(请参见下图)。
编辑
运行时系统在调用堆栈中搜索包含可以处理异常的代码块的方法。此代码块称为异常处理程序。搜索从发生错误的方法开始,并以调用方法的相反顺序遍历调用堆栈。当找到适当的处理程序时,运行时系统将异常传递给处理程序。如果引发的异常对象的类型与处理程序可以处理的类型匹配,则认为异常处理程序是适当的。
所选的异常处理程序被称为捕获异常。如果运行时系统穷尽搜索调用堆栈上的所有方法,而没有找到适当的异常处理程序,如下图所示,则运行时系统(以及程序)将终止。
编辑 与传统的错误管理技术相比,使用异常来管理错误具有一些优势。您可以在“异常的优势”部分中了解更多信息。
二、捕获或指定要求
有效的Java编程语言代码必须满足Catch或Specify要求。这意味着可能引发某些异常的代码必须由以下任一项括起来:
- 捕获异常的try语句。try必须为异常提供处理程序,如捕获和处理异常中所述。
- 指定它可以引发异常的方法。该方法必须提供列出异常的throws子句,如指定由方法引发的异常中所述。
无法满足Catch或Specify要求的代码将无法编译。
并非所有例外都受Catch或Specify要求的约束。为了理解原因,我们需要研究三种基本的例外类别,其中只有一种符合要求。
三、三种Exceptions
第一种异常是检查异常。这些是编写良好的应用程序应该预见并从中恢复的异常情况。例如,假设应用程序提示用户输入输入文件名,然后通过将名称传递给java.io.FileReader的构造函数来打开该文件。通常,用户提供现有可读文件的名称,因此FileReader对象的构造成功,应用程序的执行正常进行。但有时用户提供不存在的文件的名称,构造函数抛出java.io.FileNotFoundException。编写良好的程序将捕获此异常并通知用户错误,可能会提示输入更正的文件名。
选中的异常受Catch或Specify要求的约束。除错误、运行时异常及其子类所指示的异常外,所有异常都是检查异常。
第二种异常是错误。这些是应用程序外部的异常情况,应用程序通常无法预测或恢复。例如,假设应用程序成功地打开文件以进行输入,但由于硬件或系统故障而无法读取该文件。不成功的读取将引发java.io.IOError。应用程序可能会选择捕获此异常,以通知用户问题-但程序打印堆栈跟踪并退出也可能有意义。
错误不受Catch或Specify要求的约束。错误是由Error及其子类指示的异常。
第三种异常是运行时异常。这些是应用程序内部的异常情况,应用程序通常无法预测或恢复。这些通常表示编程错误,例如逻辑错误或API使用不当。例如,考虑前面描述的应用程序,该应用程序将文件名传递给FileReader的构造函数。如果逻辑错误导致向构造函数传递null,构造函数将抛出NullPointerException。应用程序可以捕获此异常,但消除导致异常发生的错误可能更有意义。
运行时异常不受Catch或Specify要求的约束。运行时异常是由RuntimeException及其子类指示的异常。
错误和运行时异常统称为未检查异常。
Doker 技术人的数码品牌!!!
文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群!!!你的支持和鼓励是我创作的动力❗❗❗
官网:Doker 多克; 官方旗舰店:首页-Doker 多克创新官方店-淘宝网全品大优惠优惠!!!