在Java中异常的“抓抛”
异常其实是“异常事件”的简写,那么关于异常的定义是:
- 异常是一个事件,它发生在程序的执行过程中,使得程序指令的正常流程中断。
异常中的“抓抛”其实只是“捕获异常”和“抛出异常”而已,程序首先会“抛出异常”,然后再去捕获异常,关于两者的作用过程,请看下面的深入分析:
- 什么是抛出异常呢?
当一个方法内部发生错误,这个方法会创建一个对象,并将该对象传给运行系统。
这个对象称之为“异常对象( exception object )”,它包含错误的信息——错误类型和错误发生时的程序状态。
创建一个异常对象并将该对象传递给运行系统的过程就称之为“抛出异常” - 什么是捕获异常呢?
在方法抛出异常后,运行系统会尝试去寻找能够处理异常的“东西”,这些能够处理异常的“东西”其实是一个集合,在这个集合中的每一个“东西”都可能处理异常,那么这些“东西”们是指那些呢?
其实不难理解,这些“东西”们就是一个有序方法列表,他们从main()方法开始,层层调用,直到某个方法出现了错误。这个方法列表也被称之为“调用栈(call stack)”。见下表运行系统会在调用栈中检索一个包含有处理该异常代码块的方法。(这个代码块也被称为一个“异常处理器(exception handler)”)。这个检索顺序是这样的,它首先从发生异常的方法开始,然后按调用栈的逆向继续检索下去。
当找到一个合适(appropriate)的异常处理器,运行系统就会把异常传递给该处理器。那什么才能算得上“合适的异常处理器”呢?如果一个被抛出的异常对象的类型匹配得上可以被某一异常处理器可以处理的类型,那么这个异常处理就被认为是“合适的异常处理器”。
选择处理器的过程就称之为“捕获异常”。
如果运行系统耗尽一切搜索完调用栈中的所有方法也没有找到异常处理器,那么运行系统就会中断。