1 异常的概念
(1)异常是指程序在运行过程中出现的非正常情况,会导致JVM非正常终止;
(2)在java中,每个异常都有一个对应的类,异常的产生就是创建对应的异常对象并抛出;
(3)异常的作用就是帮助程序员定位问题的。
2 异常体系
(1)异常的根类是java.lang.Throwable,其下有两个子类java.lang.Error和java.lang.Exception,我们所说的异常是指Exception
(2)异常的分为编译时期异常和运行时期异常两种
1)编译时期异常:必须进行处理的异常,如果抛出了异常但是没有处理,编译器会报错,也就是必须显示进行异常处理
2)运行时期异常:可以不处理,是某个方法抛出,或则在执行时虚拟机抛出,系统默认会抛给JVM,JVM会打印信息并终止运行;
3)区别:编译期异常被创建,必须try或throw(throw是层层向上,直到被try或者到达虚拟机);
运行期异常创建后可以不处理;
3 异常的产生过程过程
(1) 每个异常都有对应的类,所以一个异常的产生对应一个异常对象的创建,以数组越界为例
4 异常的处理方式
异常一般有连两种处理方式,一种是声明throws,将异常抛出,一种是try...catch处理
(1)throws声明抛出异常
格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
(2)try...catch捕获异常
1)try捕获异常后,如果在catch没有继续抛出异常,则后续代码可以继续执行,不会中断
2)格式:
3)try...catch三种写法
1)多个异常:1个try,1个catch
2)多个异常:1个try,多个catch:建议采用该种书写方式
3) 多个异常:多个try,多个catch
4)finally
(1)在finally是try..catch方式的可选代码,finally代码块中的代码(除了在try或catch中调用退出虚拟机代码)一定会被执行,一般用来写资源关闭的代码
(2)finally如果写上return,会覆盖原有程序的return,就连catch中抛出的异常也会被覆盖,所以要谨慎使用。
(3)子类继承父类时,父类有异常需要注意
(1)父类方法有异常,子类重写父类有异常的方法时,需要声明父类的异常或则父类异常的子类或则不抛出异常
(2)父类方法没有异常,子类重写父类的方法时候,不能抛出异常,发生异常只能在内部处理(运行时异常除外,运行时异常不用进行处理,系统会有默认处理机制)
5 自定义异常
(1)自定义异常需要继承Exception(编译时异常)或则RuntimeException(运行时异常);
(2)自定义异常一般要写上有参构造函数,构造函数直接调用父类的有参构造函数,参数为异常的提示信息。