异常的转换:例如电脑的蓝屏是可以解决的,但是电脑进水确实没有办法解决的。两个属于不同的异常类型
讲解一下异常类型转换
抛出的问题必须是调用者可以处理的,如果不能处理那么就进行异常转换
基于编译异常应用代码的扩展:电脑出现冒烟死机
package Exception;
import jdk.jshell.spi.ExecutionControl;
/*编译异常——异常的类型转换
描述李老师使用电脑上课
安全隐患为:电脑会蓝屏,电脑冒烟
*/
//异常类
class BlueException extends Exception {//蓝屏异常
BlueException(){
super();
}
BlueException(String s){
super(s);
}
}
class MaoYanException extends Exception {
MaoYanException(){
super();
}
MaoYanException(String s){
super(s);
}
}
class NoPlanException extends Exception {
NoPlanException() {
super();
}
NoPlanException(String s) {
super(s);
}
}
//电脑
class Computer {
private int state = 2;//电脑的状态
void Run() throws BlueException, MaoYanException {
if (state == 0) {
throw new BlueException("电脑蓝屏了!!");
}
if (state == 2) {
throw new MaoYanException("电脑冒烟了!!!");
}
System.out.println("电脑运行!!!");
}
void ComputerReset() {
state = 1;
System.out.println("电脑重启了!!");
}
}
//老师
class Teacher {
private String name;
private Computer notebook;
Teacher(String name) {
this.name = name;
notebook = new Computer();
}
public String toString(){
return name+"老师上课";
}
public void Prelect() throws NoPlanException {
try {//只负责检测
notebook.Run();//使用电脑上课
//传递一个异常对象给catch
} catch (BlueException B) {
//要写出蓝屏后具体的解决方法————重启
System.out.println(B.toString());//toString:返回异常信息/名字+内容
B.printStackTrace();//将此throwable和其追溯打印到指定的打印流
notebook.ComputerReset();//重启
} catch (MaoYanException B) {
/*
对于电脑冒烟这个事,老师是无法给出解决方法的所以不能在老师的类里面声明冒烟异常,但是老师可以对冒烟造成的后果进行处理
*/
System.out.println(B.toString());
Test();
//但是电脑冒烟这个问题本质上还是没有解决,因此要向外抛出老师可以传达的异常(由电脑冒烟产生的)
throw new NoPlanException("课时停止!!!");
}
}
public void Test() {
System.out.println("做练习题!!");
}
}
public class ExceptionTest {
public static void main(String[] args) {
Teacher T = new Teacher("Li");
try {
T.Prelect();
}
catch (NoPlanException N) {
System.out.println(N.toString());
Teacher t = new Teacher("liu");
System.out.println("换老师!!");
System.out.println(t.toString());
}
}
}
Throw Throws 的区别
1. throw用在函数内
throws 用在函数上
2. throw抛出的是异常对象
throws用于对异常类的声明,后面的异常类可以有多个,用逗号隔开