/*
练习1:
老师用电脑上课
考虑上课中出现的问题
比如问题是
电脑蓝屏
电脑冒烟
要对问题进行描述,要封装成对象
可是当冒烟发生后,出现讲课进度无法继续
出现了讲师的问题,课时计划无法完成
*/
class NoPlanException extends Exception//计划无法完成
{
NoPlanException(String message)
{
super(message);
}
}
class LanPingException extends Exception// 电脑蓝屏
{
LanPingException(String message )
{
super(message);
}
}
class MaoYanException extends Exception// 电脑冒烟
{
MaoYanException(String message)
{
super(message);
}
}
class Computer//电脑对象
{
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()
{
state = 1;
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)//这个异常Teacher对象可以处理
{
System.out.println(e.toString());
cmpt.reset();
}
catch(MaoYanException e)//这个异常Teacher对象处理不了(因为老师不会修电脑),抛可以让Teacher对象处理的异常
{
test();//要放在异常的上面,因为throw是函数的结束标识了
throw new NoPlanException("课程无法继续 "+e.getMessage());
}
System.out.println("讲课");
}
public void test()
{
System.out.println("做练习");
}
}
class ExceptionDemo5
{
public static void main(String[] args)
{
Teacher t = new Teacher("毕老师");
try
{
t.prelect();
}
catch (NoPlanException e)
{
System.out.println(e.toString());
System.out.println("换老师");
}
}
}
/*
练习2.有一个圆形和长方形
都可以获取面积。对于面积如果出现非法的数值,视为是获取面积出现问题
问题通过异常来表示
现在对这个程序进行基本设计
正常流程代码和问题处理代码分离开来了
*/
class NoValueException extends RuntimeException//因为出现负数的时候,就要程序直接结束
{
NoValueException(String message)
{
super(message);
}
}
interface Shape//定义接口
{
void getArea();//定义函数
}
class Rec implements Shape
{
private int len,wid;
Rec(int len,int wid)
{
if(len<=0||wid<=0) //抛出自定义异常
throw new NoValueException("出现非法值");
this.len = len;
this.wid = wid;
}
public void getArea()
{
System.out.println(len*wid);
}
}
class Circle implements Shape
{
private int radius;
public static final double PI = 3.14;//定义全局常量
Circle(int radius)
{
if(radius<=0)//抛出自定义异常
throw new NoValueException("出现负值了");
this.radius = radius;
}
public void getArea()
{
System.out.println(radius*radius*PI);
}
}
class ExceptionDemo7
{
public static void main(String[] args)
{
Rec r = new Rec(3,4);
r.getArea();
Circle c = new Circle(-8);
c.getArea();
}
}
/*
--------------------
异常的处理格式
第一个格式:
try
{}
catch()
{}
第二个格式:
try
{}
catch()
{}
finally
{}
第三个格式:
try
{}
finally
{}
catch是用来处理异常的,如果没有catch就代表异常没有被处理过
该异常是检测时异常,则必须声明
-----------------
异常在子父类覆盖中的体现
1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该类异常的子类
2.如果父类方法抛出多个异常,那么子类在覆盖该方法的时,只能覆盖父类异常的子集
3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常
如果子类方法发生了异常,那么就必须进行try处理,绝对不能抛
class AException extends Exception
{
}
class BException extends AException
{
}
class CException extends Exception
{
}
Exception
|--AException
|--BException
|--CException
早期的异常不能处理后期产生的异常
*/
class Fu
{
void show()throws AException
{}
}
class Zi extends Fu
{
void show()//不能写 throws CException,因为子类的覆盖方法,只能抛出父类的异常或者该类异常的子类
{}
}
class Test
{
void function(Fu f)
{
try
{
f.show();
}
catch (AException e)//这里不能处理CException异常,所以下面不能用t.function(new Zi());
{ //早期的异常不能处理后期产生的异常
}
}
}
class ExceptionDemo6
{
public static void main(String[] args)
{
Test t = new Test();
t.function(new Fu());
//t.function(new Zi());不能这样用
}
}
黑马程序员_异常练习
最新推荐文章于 2014-08-30 19:24:37 发布