基类 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类
调用方法与系统一致