第十二章 通过异常处理错误

 

 

异常处理是java中唯一正式的错误报告机制,并且通过编译器强制执行。使用异常的好处是,它往往降低了错误处理代码的复杂度,如果不使用异常,那就必须检查特定的错误,并在程序中许多地方去处理它。而使用了异常,那就不必在方法调用处进行检查,因为异常机制将保证能捕获这个错误(try)。并且,只需要在一个地方处理错误,即所谓的异常处理程序中(catch子句)。这种方式不仅仅节省代码,而且把“描述在正常执行过程中做什么事”的代码(try)和“出了问题怎么办”的代码(catch)相分离。使得代码阅读,编写,调试更井井有条。

异常情形是指阻止当前方法或作用于继续执行的问题,当异常抛出后,有几件事会随之发生。首先,同java中其他对象的创建一样,将使用new在堆上创建异常对象。然后,当前执行的路径(它不能继续下去了)被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。这个恰当的地方就是异常处理程序,它的任务是将程序从错误状态中恢复,以使程序能要么换一种方式运行,要么继续执行下去。异常允许我们强制程序停止运行,并告诉我们出现了什么问题,或者强制程序处理问题,并返回到稳定状态。

 1 package 异常.Finally;
 2 
 3 public class ExceptionTest {
 4 
 5     public static void main(String[] args) {
 6         test();
 7     }
 8     
 9     public static void test() {
10         try {
11             System.out.println("begin:");
12             except();
13             System.out.println("over");
14         }catch(ArithmeticException e) {
15             System.out.println("出异常了");
16         }
17     }
18     
19     public static int except() {
20         System.out.println("-----");
21         int i = 100 / 0;
22         System.out.println("======");
23         return i;
24     }
25 
26 }

 

打印结果:

begin:
-----
出异常了

 

程序的当前执行路径11-12-20-21-22-23-13,当在21处发生异常时,当前执行路径终止,进入异常处理程序catch块。使程序从错误的状态恢复,换一种方式继续执行下去。

 

如果在方法内部抛出了异常(或者在方法内部调用的其他方法抛出了异常),这个方法将在抛出异常过程中结束。(要是不希望方法就此结束,可以像上面程序那样,在方法块内设置一个try块捕获异常,try块里会尝试各种(可能产生异常的)方法调用。)

 1 package 异常.Finally;
 2 
 3 public class ExceptionTest {
 4 
 5     public static void main(String[] args) {
 6         test();
 7         System.out.println("+++++");
 8     }
 9     
10     public static void test() {
11         System.out.println("begin:");
12         except();
13         System.out.println("over");
14     }
15     
16     public static int except() {
17         System.out.println("-----");
18         int i = 100 / 0;
19         System.out.println("======");
20         return i;
21     }
22 
23 }

打印结果:

begin:
-----
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at 异常.Finally.ExceptionTest.except(ExceptionTest.java:17)
    at 异常.Finally.ExceptionTest.test(ExceptionTest.java:11)
    at 异常.Finally.ExceptionTest.main(ExceptionTest.java:6)

当发生异常时,当前执行路径终止,如果没有捕获异常的try-catch块,方法将在抛出异常的过程中结束。从控制台打印的栈轨迹看出:execpt方法在17行结束,test方法在11行结束,main方法在第6行结束。

 

posted @ 2018-07-03 16:18  刘呆哗  阅读(138)  评论(0编辑  收藏  举报