一、众所周知,当我们在编写程序或者运行程序时,经常出现难以预料的各种状况,这就是异常。
在Java的API中将throwable类的众多子类用来描述各种不同的异常。
通常情况下,我们将throwable分为Error和Exception,而他们的子类又分别描述不同的异常。
1、Error:
翻译为错误,指的是程序无法处理的错误,表示在运行时遇到的问题比较严重,当错误发生时,常常与伴随着程序的停止运行。
2、Exception:
译为异常,这里指的是程序本身可以处理的异常,这里又可以把异常进行细分:
按照可否查询来区分:可查异常、不可查异常;
按照异常发生时间段来区分:运行时异常、非运行时异常(编译期异常)。
二、在 Java 应用程序中,异常处理机制为:抛出异常,捕获异常。
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统没有找到合适的异常处理器,则系统终止运行。同时,意味着Java程序的终止。
通常我们用try/catch/finally来捕获异常,try后面接可能出现异常的代码,作为一个监控的区域,当该区域出现异常时,就创建一个异常对象,然后试图尝试找到与之匹配的catch语句,如果找到,就运行这段异常代码。这里所说的匹配指的是:如果该抛出的异常对象属于catch语句的异常类,或者说是属于该异常类的一个子类,那么就认为匹配。
另外,被finally修饰的语句无论是否捕获或处理异常都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。经过查阅资料得出在下列几种情况下finally块不会被执行:
1、在finally语句块中发生了异常。
2、在前面的代码中用了System.exit()退出程序。
3、程序所在的线程死亡。
4、关闭CPU。