一、案例:Coco老师来上课
为了程序的健全性,程序可能会出现的问题:
1 电脑蓝屏
2 电脑冒烟
(1)电脑类
class Computer {
// 定义一种状态控制异常发生
private int state = 2;
// 电脑运行方法
public void run() throws LanPingException, SmokingException {
if (state == 1) {
// 电脑蓝屏,抛出异常
throw new LanPingException("电脑蓝屏了");
}
if (state == 2) {
// 电脑蓝屏,抛出异常
throw new SmokingException("电脑冒烟了");
}
System.out.println("笔记本电脑正在运行");
}
// 电脑启动功能
public void reSet() {
// 将电脑状态恢复到默认值
state = 0;
System.out.println("重新启动电脑");
}
}
(2)coco老师
class Teacher {
// 成员变量
private String name;
//(2) 引用类型成员变量
private Computer com;
// 构造方法
public Teacher(String name) {
this.name = name;
// 每次创建老师对象时就带上电脑类
this.com = new Computer();
}
// 老师上课方法
public void lesson() throws StopLessonException {
try {
// 调用电脑的方法
com.run();
} catch (LanPingException e) {
System.out.println(e.toString());// 打印异常信息
// 调用电脑重新启动功能
com.reSet();
} catch (SmokingException s) {// SmokingException s = new BluePingException();
// 紧急处理方式,做练习
this.test();
// 做练习只是一个临时解决方式,但是此时并没有解决电脑冒烟问题。所以继续向上抛异常,抛给main方法
// throw s;
/* 讲课中冒烟,问题可以临时解决,但是冒烟问题讲课时不能解决,所以使用throw向上抛
* 抛给main方法后我们发现,这个问题不属于讲课方法的问题,讲课方法的调用者也没有办法解决这个问题
* main方法只能解决因为上课无法继续进行的问题。对冒烟问题并没有针对性的解决。
因此,就需要重新定义一个课时停止异常来解决这个冒烟问题。
*/
throw new StopLessonException("课程停止");
//上述过程叫异常转换(将冒烟异常转给课时停止异常转换)
}
System.out.println(name + "老师正在给大家激情地上课");
}
// 紧急处理方式:布置作业
public void test() {
System.out.println("同学们做小练习");
}
}
(3)自定义异常类
// 电脑蓝屏异常类
class LanPingException extends Exception {
public LanPingException() {
super();
}
public LanPingException(String message) {
super(message);
}
}
// 电脑冒烟异常类
class SmokingException extends Exception {
public SmokingException() {
super();
}
public SmokingException(String message) {
super(message);
}
}
//课时停止异常类
class StopLessonException extends Exception {
public StopLessonException() {
super();
}
public StopLessonException(String message) {
super(message);
}
}
(4)测试类
public class ExceptionDemo03 {
public static void main(String[] args) {
Teacher t = new Teacher("coco");
try {
t.lesson();
} catch (StopLessonException sp) {
sp.printStackTrace();
//课程停止异常后的解决方法:换老师
System.out.println("换老师");
}
}
}
二、思路总结
(1)自定义蓝屏异常后,电脑发生异常。电脑自己不能处理异常,就向上抛出异常。老师类调用了电脑的方法,因此老师讲课方法接受到了蓝屏异常,老师可以处理这个异常,就使用catch()进行捕获,然后在老师自己调用重新启动电脑的方法。
(2)自定义冒烟异常后,电脑发生异常。电脑抛给调用者(老师类),我们发现老师也不能解决这个冒烟异常。只能暂时停止上课,让学生先做小练习。如果继续向上抛出给main方法中的讲课方法,发现也不能解决冒烟异常。
(3)此时就可以采用异常转换。直接在老师讲课方法中抛出课时停止异常类,在main方法中进行处理,处理方法就是换老师。