1、finally
finally 代码块:定义一定执行的代码,通常用于关闭资源(例如关闭数据库)。
即使在函数中,finally代码块定义在return语句之后,finally也一定被执行。
代码示例:
class ExceptionDemo{
public static void main(String[] args){
Demo d = new Demo();
try{
int f = d.div(5,0);
System.out.println(f);
}
catch(ArithmeticException e){
System.out.println(e.toString);
System.out.println("除零啦");
}
finally{ //finally代码块一定被执行,即使在return语句之后
System.out.println("over");
}
}
}
class Demo{
int div(int a, int b) throws ArithmeticException{
return a/b;
}
}
2、异常块的三个格式
(1)第一种格式:try-catch
try {
可能会发生异常的代码;
}
catch () {
处理异常的代码;
}
(2)第二种格式:try-finally
try {
可能会发生异常的代码;
}
finally {
一定会执行的代码;
}
(3)第三种格式:try-catch-finally
try {
可能会发生异常的代码;
}
catch(){
处理异常的代码;
}
finally {
一定会执行的代码;
}
记住一点:catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是编译时被检测异常(相对于RuntimeExceptiong不被检测异常),那么必须声明。
3、异常在子父类覆盖中的体现
(1)子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。(子类若抛出 新的异常则不能处理,编译失败)
(2)如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
(3)如果父类或接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常;
如果子类方法发生了异常,就必须要进行try处理(内部处理),绝对不能抛出。
4、异常小练习
异常小练习:
老师用电脑上课
开始思考上课中出现的问题。
比如:电脑蓝屏
电脑冒烟。
对问题进行描述,封装成对象。
可是当冒烟发生后,出现讲课进度无法继续。
写一个实例。
简单分析:
有老师和电脑这两个事物,则定义Teacher类和Computer类;
老师讲课时会先启动电脑,则Teacher初始化时也初始化Computer,Teacher的构造函数中可创建一个Computer对象;
通过一个变量来控制什么异常,Computer类中需抛出异常,Teacher类中需处理异常,Teacher处理不了的异常,可再在主函数中定义try-catch 来处理。
代码如下:
/* 程序说明:
老师启动电脑时,会遇到电脑异常,如电脑蓝屏和电脑冒烟,
电脑蓝屏时,交给老师处理,处理方法是重启电脑。
电脑冒烟时,老师无法处理,课程无法继续。
state = 2 时,为电脑蓝屏异常;
state = 3 时,为电脑冒烟异常。
*/
class LanPingException extends Exception{ //可以处理的异常,继承Exception
LanPingException(String message){
super(message);
}
}
class MaoYanException extends Exception{
MaoYanException(String message){
super(message);
}
}
class NoPlanException extends Exception{
NoPlanException(String message){
super(message);
}
}
class Computer { //电脑需要抛出异常,state=2就抛出蓝屏异常,state=3就抛出冒烟异常;电脑有运行和重启功能。
private int state = 3; //更改状态发生不同异常
public void run() throws LanPingException,MaoYanException{
if(state == 2)
throw new LanPingException("蓝屏了");
if(state == 3)
throw new MaoYanException("冒烟了");
System.out.println("电脑运行");
}
public void reset(){
System.out.println("重启");
}
}
class Teacher { //老师需处理能够处理的异常,老师有讲课功能
private String name;
private Computer cmpt;
Teacher(String name){
this.name = name;
cmpt = new Computer();
}
public void prelect() throws NoPlanException{ //电脑冒烟时,老师无法处理
try{
cmpt.run();
}
catch(LanPingException e){
System.out.println(e.toString());
cmpt.reset();
}
catch(MaoYanException e){
throw new NoPlanException("课时无法继续:"+e.getMessage()); //throw和return是函数结束标识
} //遇到throw和return,函数结束
System.out.println("讲课");
}
}
class ExceptionTest {
public static void main(String[] args){
Teacher t = new Teacher("毕老师"); //初始化Teacher时会初始化computer启动电脑,会遇到电脑异常(蓝屏和冒烟)
try{
t.prelect(); //调用prelect(),会处理异常,遇到不能处理的异常,prelect()会抛出
}
catch(NoPlanException e){ //处理prelect()不能处理的异常
System.out.println(e.toString());
System.out.println("换老师");
}
}
}
state = 2 时,结果为:
state = 3 时,结果为: