基类 Throwable

两个子类 Exception(异常) 和 Error(错误)

两者区别:异常程序本身可以处理,错误无法处理

Exception两大类

运行时异常:RuntimeException及其子类异常。一般由程序逻辑错误引起。

Java运行时系统自动抛出,允许应用程序忽略运行异常。

非运行时异常:RuntimeException以外的异常。语法角度是必须进行处理的异常。

Java异常分类

可查异常:非运行时异常

正确的程序运行中容易出现的,情理可容的异常状况。

特点:Java编译器会检查它,必须用try-catch捕获或throws声明

不可查异常:运行时异常和错误

编译器不要求强制处理

Java处理异常机制

异常总是先被抛出,后被捕捉

抛出异常:当一个方法出现错误引发异常时,方法创建对象并交付运行时系统。

异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

throws 一个方法可能出现异常,无能力处理,可在方法声明处用throws子句来声明

多个异常用逗号分隔method() throws Exception1,Exception2,Exception3…

仅当抛出了异常,该方法的调用者才必须处理或重新抛出该异常。当方法调用者无力处理该异常时,应当继续抛出。

throw 总是出现在函数体中,用来抛出一个Throwable型的异常。

程序会在throw语句后立即终止,后在包含它的所有try块中从里向外寻找含有与其匹配的catch子句的try块。

如果抛出了检查异常,还应在方法头部声明声明方法可能抛出的异常类型。方法调用者也必须检查处理抛出的异常。

若所有方法都层层上抛异常,最终jvm会处理。

捕获异常:在方法抛出异常之后,运行时系统转为寻找合适的异常处理器。

潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与抛出的异常类型相符时,即为合适的异常处理器。

运行时系统从发生异常的方法开始,依次回查调用栈中的方法,若找到合适异常处理器则执行,否则运行时系统终止。Java程序终止。

try-catch-finally

捕获try块内运行语句的异常

若无异常,try块内语句逐一执行,跳过catch语句块,执行finally语句块和其后的语句

若有异常,catch语句块无处理此异常的情况,此异常将抛给JVM处理,finally语句块里的语句仍会被执行,但finally语句块后语句不执行 catch语句块有处理此异常的情况,则跳到该catch语句块执行,其余catch块不执行,完毕后执行finally语句块

注意:

try或catch块中遇到return语句也会执行finally

对catch块的检查是顺声明顺序依次检查,若有某个子类异常需要处理,应放在父类异常之前

finally不执行情况:

JVM过早终止(调用System.exit())

finally块中抛出一个未处理的异常

程序所在线程死亡

关闭CPU

自定义异常

继承Exception类

调用方法与系统一致