首页 理论教育 异常处理机制

异常处理机制

时间:2022-02-28 理论教育 版权反馈
【摘要】:在Java语言中,方法的调用过程记录在Java虚拟机的方法调用栈中。当一个方法正常执行完毕后,Java虚拟机会从调用栈中弹出该方法的栈结构,然后继续处理前一个方法。如果在执行方法的过程中抛出异常,则Java虚拟机必须找到能处理异常的catch代码块。例如,例8-2中,method()方法抛出了ArithmeticException算术异常,该方法提供了处理ArithmeticException算术异常的catch代码块,就执行这个异常处理catch代码块。由于是主线程,所以终止程序。

8.1.2 异常处理机制

在Java语言中,方法的调用过程记录在Java虚拟机的方法调用栈中。该堆栈保存了每个调用方法的本地信息(如方法的局部变量)。对于java应用程序的主线程,堆栈的底部是程序的入口方法main()。每当一个新方法被调用时,Java虚拟机把描述该方法的栈结构置入栈顶,这样,位于栈顶的方法为正在执行的方法。图8-1描述了方法的调用顺序和异常的传递顺序。

注意:每个线程都有一个独立的方法调用栈。应用程序的主线程是调用main()方法的线程。

当一个方法正常执行完毕后,Java虚拟机会从调用栈中弹出该方法的栈结构,然后继续处理前一个方法。如果在执行方法的过程中抛出异常,则Java虚拟机必须找到能处理异常的catch代码块。它首先检查当前方法是否存在这样的catch代码块,如果存在,那么就执行该catch代码块;否则,Java虚拟机会从调用栈中弹出该方法的栈结构,继续到前一个方法中查找合适的catch代码块。

img494

图8-1 方法的调用顺序和异常的传递顺序

例如,例8-2中,method()方法抛出了ArithmeticException算术异常,该方法提供了处理ArithmeticException算术异常的catch代码块,就执行这个异常处理catch代码块。然后,程序继续执行catch代码块后的代码,直至程序结束。

而在例8-1中,method()方法抛出了ArithmeticException算术异常,但没有提供处理ArithmeticException算术异常的catch代码块,Java虚拟机会从调用栈中弹出method()方法的栈结构,继续到前一个main()方法中查找合适的catch代码块。

当Java虚拟机回溯到调用栈的底部方法时,如果仍然没有找到处理该异常的代码块时,按下列步骤处理。

(1)调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息。例如,例8-1,会打印下列信息:

img495

(2)如果该线程不是主线程,那么终止这个线程,其他线程继续正常运行。如果该线程是主线程,那么整个应用程序被终止。

例8-1运行结果说明,Java系统(即系统调用方法printStackTrace())将调用堆栈的轨迹打印了出来。输出的第一行信息是toString()方法输出的结果,对这个异常对象进行简单说明,即输出的是异常对象,包括异常类的名字(ArithmeticException)和该异常的描述串(/by zero)。其余各行显示的信息表示了异常抛出过程中调用的方法,即栈的底部是main()方法一行(源文件中第7行),该行调用了method()方法,而method()方法的某行(源文件中第4行)抛出了异常。由于是主线程,所以终止程序。

一般来说,一个异常处理应该完成以下三个工作(或称三部曲):抛出异常,即根据异常类型产生异常对象;捕获异常;处理异常。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈