理论上异常处理划分为两个模型(中止模型与继续模型),但实际使用方面我们对中止模型用的比较多,这个模型比较实用,而继续模型则不是那么的应用普遍,多少是耦合的过于紧密。
假设错误非常严重,已至你无法在回到错误发生的地方,也就是说,这段程序经过判断认为,他已经没有办法挽回,于是就抛出异常,希望这个异常不要在回来,这也是Java 当前所采用的模式。长久以来,尽管程序员们使用的操作系统支持恢复模型的异常处理,但他们最终还是转向使用类似“终止模型”的代码,因为这样可以编写出更加通用性的代码。
public class StopGenteelly {
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination tpt = new TwoPhaseTermination();
tpt.start();
Thread.sleep(100);
tpt.stop();
}
}
class TwoPhaseTermination{
private Thread thread;
public void start(){
thread = new Thread(()->{
while (true){
if (thread.isInterrupted()){
System.out.println("线程被中断,结束线程");
break;
}
try {
System.out.println("做一些工作。。。");
Thread.sleep(1000); //在这里中断,会抛出InterruptedException
} catch (InterruptedException e) {//中断标记会被重置
e.printStackTrace();
thread.interrupt();
}
}
});
thread.start();
}
public void stop(){
thread.interrupt();
System.out.println("中断线程");
}
}
这种模型的主旨是恢复当前的运行环境,然后希望能够重新回到错误的发生地,并希望第二次的尝试能够获得成功,这种模型通常为操作系统所应用。
不过值得一提的是“继续模型”也并非一无是处,在某些情况下采用“伪继续模型”依然可以起到对程序的恢复作用。具体方法就是把try块放在while循环里,这样就不断地进入try块,直到得到满意的结果。
class MyException extends Exception{
MyException(){}
MyException(String msg){
super(msg);
}
}
public class LoopsException {
private static int i=0;
public void loopf(int f) throws MyException{
if(i
System.out.println("i too tiny");
throw new MyException("Can't run");
}else{
System.out.println("i enough");
}
}
public static void main(String[] args){
LoopsException le=new LoopsException();
while(true){
try{
le.loopf(15);
System.out.println("i="+i);
break;
}catch(MyException e){
e.printStackTrace(System.out);
}
i++;
}
}
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54