异常(二)

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初始化时也初始化ComputerTeacher的构造函数中可创建一个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 时,结果为:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值