异常:就是程序在运行的时候出现的不正常的情况
对于严重的问题,通过Error类进行描述
对于Error一般不编写针对性的代码去进行处理
对于非严重问题,通过Exception类进行描述
对于Exception可以通过针对性的代码去进行处理
异常的处理:
try{
需要被检测 的语句
}catch(异常的类变量){
处理异常的代码(处理方式)
}finally{
一定会执行的代码
}
用throws抛出异常 抛出多个异常时中间用逗号隔开
对多异常的处理:
1. 声明异常时,建议声明更为具体的异常,这样调用者可以处理的更具体
2. 对方声明了几个异常就应该对应有几个catch块,不要对应多余的catch块。
如果多个catch块中的异常出现了继承关系父类的异常catch块要放在最下面。
自定义异常
必须自定义的类继承exception
继承的原因:异常体系有自己的特点,异常类和异常对象都需要被抛出,可抛性是throwable这个体系的独有的特点,只有这个体系中的类和对象才能被throw和throws操作。
throw和throws的区别:
throw使用在函数内的,throws是用在函数上的。
throw后面抛出的是异常对象,throws抛出的是异常类(可以有多个,用逗号隔开)
Exception中有一个特殊的子类,RuntimeException运行时异常,如果在函数内抛出了该异常,在函数上可以不用声明,编译一样通过,如果在函数上抛出该异常,调用者可以不用进行处理,编译一样通过
异常分为两种:
编译时被检测异常:如果在函数中抛出,就必须在函数上进行声明。并且调用者必须做相应的处理,否则编译失败。
编译时不被检测异常:运行时异常(运行时异常及其子类)
异常在继承体系的体现:
1. 子类继承父类,在覆盖父类的方法时,只能抛出父类的异常或者父类异常的子类或者不抛出任何异常
2. 如果父类抛出了多个异常,那么子类在覆盖方法的时候,只能抛出父类异常的子集,或者其中的子类
3. 如果父类或者接口的方法中没有抛出异常,那么子类在覆盖方法的时候,也不可以抛出异常,如果子类的方法中发生了异常,那么必须要进行try-catch处理,绝对不能不抛出。
异常总结
异常:是对问题的描述,将问题进行封装
异常体系:
throwable
----Error
----Exception
异常体系的特点:
异常体系中所有的类以及建立的对象都具有可抛性,可以被throw或者throws操作
只有异常体系具有这个特点
throw 和throws的用法:
throw定义在函数中,抛出的是异常对象
throws定义在函数上,抛出的是异常类
异常分为两种:
编译时异常:该异常在编译时,如果没有被处理,编译失败
该异常被声明,代表着可以被处理
运行时异常:在编译时,不需要处理,编译器不会检查,建议该异常发生时不处理,让 程序停止,修正代码
异常处理语句:
try{}catch{}finally{}
三种结合方式
try{}catch{}finally{}
try{}catch{}
try{}finally{}
注意:finally中通常定义的是关闭资源的代码
只有一种情况finally不会执行,就是在上面出现了System.exit(0);语句
JVM退出,程序不会继承执行
自定义异常:定义类继承Exception或者其子类
1. 为了让该定义的类具有可抛性
2. 让该类具备操作异常的共性方法
当自定义异常时,可以使用父类已经定义好的功能,将异常信息通过构造方法传递
异常的好处:
1. 将问题进行了封装
2. 将正常代码与处理问题代码进行分离
异常的处理原则:
1. 处理方式有两种:try或者throws
2. 调用到抛出异常的功能的时候,抛出几个异常就要处理几个异常,一个try对应多个catch
3. 如果有多个catch,父类的catch要放在最下面
4. catch中要定义具体的针对性的处理方式,不要简单的定义输出语句,也不要不写
当捕捉到的异常,本功能处理不了的时候,可以继续在catch中抛出新的异常。
try{}catch(Exception e){ throw new BException() }
如果该功能处理不了,但并不是该功能出现的异常,可以将异常进行转换后再抛出与它功能相关的异常,或者异常可以处理,但是需要将异常产生的和本功能相关的问题提供出去,让调用者知道,并处理
异常的注意事项:
1. 在子父类覆盖时,子类抛出的异常必须是父类异常或者父类异常的子类或者子集
2. 如果父类或者接口没有抛出异常,子类出现异常,只能try catch处理。