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


    异常处理是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行结束。

    前进时,请别遗忘了身后的脚印。
  • 相关阅读:
    poj 1579(动态规划初探之记忆化搜索)
    hdu 1133(卡特兰数变形)
    CodeForces 625A Guest From the Past
    CodeForces 625D Finals in arithmetic
    CDOJ 1268 Open the lightings
    HDU 4008 Parent and son
    HDU 4044 GeoDefense
    HDU 4169 UVALive 5741 Wealthy Family
    HDU 3452 Bonsai
    HDU 3586 Information Disturbing
  • 原文地址:https://www.cnblogs.com/liudaihuablogs/p/9258455.html
Copyright © 2020-2023  润新知