一、异常分类
1、Throwable
是Java异常的顶级类,所有异常都继承于这个类;Error,Exception是异常类的两个大分类。
2、Error
Error是非程序异常,即程序不能捕获的异常,一般是编译或者系统性的错误,不由程序来处理。
3、Exception
Exception是程序异常类,由程序内部产生;Exception又分为运行时异常,非运行时异常类。
4、RuntimeException
运行时异常,特点是java编译器不会检查它,也就是说,当程序中可能出现这类异常时,会编译通过,但是在运行时会出现错误。
5、非RuntimeException
非运行时异常,程序必须进行处理的异常,编译不通过,必须捕获或者抛出。包括IOException、ClassNotFoundException、CloneNotSupportedException等。
ps:
- Uncheckd Exception:编译器不会辅助检查,包括Error和RuntimeException。
- Checkd Exception:编译器会辅助检查,即Exception的子类中所有非RuntimeException的类。
- 以上二者并非实际的类。
二、异常处理
1、Java异常处理的目的
- 允许用户即使保存结果
- 抓住异常,分析异常内容
- 控制程序返回到安全状态
2、try-catch-finally:一种保护代码正常运行的机制
(1)结构特点:一个try,可以有多个catch,但只能有一个finally,且catch和finally二者至少有其中一个。
- try:正常业务逻辑代码
- catch:当try发生异常,将执行catch代码,若无异常,绕之。
- finall:当try或catch执行结束后,必须执行finally。
(2)catch块可以有多个,每个有不同的入口形参。当已发生的异常与某个catch块中的形参类型一致,将执行该catch块的代码。如果没有一个匹配,catch则不会被触发;
进入catch块后,并不会返回到try发生异常的位置,也不会执行后续的catch块,一个异常只能进入一个catch块。
(3)若有finall块,无论怎样最后都会进入finally,finall一定会被执行。。
ps:
- catch的异常匹配是按从上到下的顺序进行匹配的,所以一般是将小的异常写在前面,而大一些(宽泛)的异常则写在后面。
- try-catch-finally的每个模块里也会发生异常,所以每个模块内部可以继续写一个完整的try结构。
3、throws
方法存在可能出现异常的语句,但不处理,那么可以使用throws来声明异常。
- 调用带有throws异常(checked exception)的方法,要么处理这些异常,要么再次向外throws,直到main函数为止。
- 带有throws的方法被覆盖,覆盖它的方法必须抛出同样的异常,或者该异常的子类。
- 如果父类方法抛出多个异常,那么重写的子类方法必须抛出这些异常的子集,也就是不能抛出新的异常。
三、自定义异常
1、自定义异常,需要继承Exception类或其子类。
- 继承自Exception,就变成Checked Exception。
- 继承自RuntimeException,就变成Unchecked Exception。
2、自定义重点在构造函数
- 调用父类Exception的message构造函数。
- 可以自己定义成员变量。
3、在程序中采用throw主动抛出异常。