zoukankan      html  css  js  c++  java
  • 第十二章 通过异常处理错误

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

    前进时,请别遗忘了身后的脚印。
  • 相关阅读:
    理解OpenShift(5):从 Docker Volume 到 OpenShift Persistent Volume
    理解OpenShift(4):用户及权限管理
    理解OpenShift(3):网络之 SDN
    理解OpenShift(2):网络之 DNS(域名服务)
    理解OpenShift(1):网络之 Router 和 Route
    HTML盒子模型
    架构系统的雪崩理解
    C++11 lambda表达式学习
    C++11 std::shared_ptr总结与使用
    Kafka学习笔记
  • 原文地址:https://www.cnblogs.com/liudaihuablogs/p/9258455.html
Copyright © 2011-2022 走看看