一,异常的概述
异常(Exception):异常是指程序运行是发生的不正常事件;可以被异常机制处理,程序能够继续运行下去。
错误(Error):错误不能构被处理,发生错误后,程序就终止,需要修改源码才能解决。
二,异常体系结构
1,异常的顶级父类是Throwable类。
2,其下分为Exception和Error两个子类
3,异常分为运行时异常(RuntimeException)和非运行是异常(检测异常)。
4,运行期异常在编译期不会报错,但是运行会终止,所以需要对其进行控制,常见的运行时异常,
NullPointerException 空指针异常
ClassCastException 类型转换异常
IndexOutOfBoundsException 索引越界异常
ArithmeticException 算数异常
5,除去基本父类是RuntimeException(或者其子类的),都是非运行异常,在编译期会报错,必须进行处理
如: IOException IO流异常/输入输出异常
SQLException SQL异常
三,异常处理流程
1,try-catch-finally
(1)try块
是一个普通的普通的作用域,try关键字开头,在其中包裹可能产生的违例。
一旦抛出异常,其后面的代码将不在执行
(2)catch块
违例控制器在try后面,并用catch捕获。用法catch(异常类型 变量){处理代码}。
catch可以有多个,如果存在父子关系,那么子类catch块需放在父类前面(否则编译错误),但try块抛出的异常与catch中的异常(包含运行是异常)匹配,匹配到谁执行谁。
catch块中声明的异常是抛出异常的父类,则也会捕获。如果几个异常处理的方式相同则可以在catch块中用
单或(|)分隔不同的异常。
(3)finally
try块后面必须跟一个catch块或者finally块。
无论是否有异常,(就算在try或者cathch块中有return;)finally块都会执行
System.exit(0),退出虚拟机,finally不执行。
2,throw和throws
(1)throws用在方法签名上,后面跟异常类型,表明可能会抛出的异常。
用法void f() throws Exception{}
使用这种方式后,在方法中就算抛出异常,也不一定需要处理,谁调用此方法,谁就需要处理此异常,或者继续向上抛出异常。
(2)throw 抛出异常后面接异常的实例。
异常不一定是程序被动产出的,也可以通过throw主动抛出异常。
或者在抓住一种异常后,处理掉然后抛出另外一种异常。
四,自定义违例
1,创建异常类型,同创建类一样,但需要继承一种异常。
class MyException extends Exception{}
2,内部创建构造器,与父类相对应,用super关键字调用父类的构造器。
五,违例限制
父类或者接口中的方法可以抛出异常。
1,方法
(1)如果子类方法不与父类或接口构成重写,则可以随意抛出异常。
(2)子类的方法与父类或者接口构成重写。
子类方法Throws后的异常不能大于父类方法的异常。
子类方法抛出的异常不能大于签名后跟的异常类型。
父类方法抛出异常,但是子类方法可以不抛出异常。
一个类实现了父类和接口的的同一种方法(其抛出的异常不同),那么子类抛出的异常必须同时属于父类和接口抛出的异常,如果不满足,则不能抛出异常。
2,构造器
父类构造器throws异常后,所有其的子类必须解决父类的异常或者throws更大的异常,
而且可以添加其他不同类型的异常。