异常:程序执行过程中发生的不正常行为。重点为:程序执行过程中发生的,导致程序无法继续执行下去。编译时产生的语法错误不叫异常,因为它还没运行,可以直接解决。
异常的错误堆栈会直接提示异常产生的原因以及出错的代码位置。
程序开发中最常见的三大异常为:越界异常,NPE异常(空指针),类型转换异常(两个毫无关系的类进行转型)。
在Java中,异常也是类。其实程序抛出的异常就是一个异常对象,是JVM产生并返回程序。
一、异常的分类
异常体系核心的两个父类:
Error:JVM无法解决的重大问题,程序无法解决只能退出。
Exceprtion:异常处理后可以通过异常的处理流程来解决此类问题,使得程序继续执行。
所以异常处理流程只针对Exception类
另外异常还有另一种分类:
受查异常:又称编译时异常,在程序编译的时候必须显示处理的异常。个人理解为与编译阶段的语法错误差不多,不显示处理就运行不了。包括Exception内的IOEException SQLException等。
非受查异常:又称运行时异常,程序编译时没有产生任何错误,但是在运行时发生的异常。包括Erroe类与Exception类里的RuntimeException类。
二、异常的处理流程
Java对异常的处理方式为先执行再处理
处理异常的五个关键字:try catch finally throw throws
1 异常的捕获并处理: try - catch - finally 代码块
一些注意的地方:
a 没有异常产生不走catch语句
b 异常产生被捕获到,则try异常后的语句不执行,但一异常体系之后的代码可以执行
c 可以使用多个catch来捕获可能出现的不同异常
d 不确定具体异常时,可以使用异常的父类来捕获异常
e 若catch分支存在继承关系则必须将子类写在父类之前
f 多个catch分支只会走一个分支,其他的不执行。
g 无论是否产生异常 finally代码块的内容必定会被执行,除非整个JVM退出(例如 System.exit)
2 出现异常不处理,直接抛回给调用者处理:throw 与 throws
throws:用在方法声明上,明确表示该方法可能产生某些异常,但不处理,抛回给调用者处理。
关键点:
1.throws关键字在方法列表之后进行定义
2.throws可以抛出多个异常,多个异常使用"∵"分隔,若有父子关系,只需要抛出父类异常即可!
3.throws抛出的必须是Exception以及其子类
throw:用在方法内部,程序员在出现异常时,自己产生异常对象并向外抛出(原本异常由JVM产生,现在由程序员自己产生)一般配合自定义异常使用。
3 自定义异常
需要拓展的是非受查异常继承RuntimeException类
若需要拓展的是受查异常继承Exception类