第6章Java语言中的异常
第6章 Java语言中的异常
异常 为了加强程序的鲁棒性(强壮性, robust) 程序设计时,必须考虑到可能发生的异常 事件并做出相应的处理 例6-1 虽然程序的鲁棒性加强了,但结构臃肿,大量 的错误处理代码混杂在程序中,可读性差。目 标程序也会增大许多 出错返回信息量太少,无法更确切的了解错误 状况或原因。特别是,当出现上述语句没包含 的情况时,程序将束手无策
异常 ▪ 为了加强程序的鲁棒性(强壮性,robust), 程序设计时,必须考虑到可能发生的异常 事件并做出相应的处理 ▪ 例6-1 ▪ 虽然程序的鲁棒性加强了,但结构臃肿,大量 的错误处理代码混杂在程序中,可读性差。目 标程序也会增大许多 ▪ 出错返回信息量太少,无法更确切的了解错误 状况或原因。特别是,当出现上述语句没包含 的情况时,程序将束手无策
Java异常处理机制 预定义了 Exception类。在 Exception类中定 义了程序产生异常的条件 简化了代码的编写。常见的异常也可以统 处理,提高了效率,代码重用率高 允许程序员自己编写特殊的异常处理程序 以满足更独特的需要
Java异常处理机制 ▪ 预定义了Exception类。在Exception类中定 义了程序产生异常的条件 ▪ 简化了代码的编写。常见的异常也可以统 一处理,提高了效率,代码重用率高 ▪ 允许程序员自己编写特殊的异常处理程序, 以满足更独特的需要
抛出和捕获 方法的运行过程中,如果发生了异常,称程序产 生了一个异常事件,相应地生成异常对象。生成 异常对象并把它提交给运行时系统的这一过程称 为抛出( throw)异常 异常发生时,Java运行时系统从生成对象的代码 块开始进行回溯,找到包含相应异常处理的方法 并把异常对象交给该方法处理,这一过程称为捕 获( catch) 例6-2用异常处理方式来重写例6-1
抛出和捕获 ▪ 方法的运行过程中,如果发生了异常,称程序产 生了一个异常事件,相应地生成异常对象。生成 异常对象并把它提交给运行时系统的这一过程称 为抛出(throw)异常 ▪ 异常发生时,Java运行时系统从生成对象的代码 块开始进行回溯,找到包含相应异常处理的方法, 并把异常对象交给该方法处理,这一过程称为捕 获(catch) ▪ 例6-2 用异常处理方式来重写例6-1
异常机制的优点 把异常处理代码从常规代码中分离出来, 增加了可读性,方便修改 按异常类型和差别进行分组,即从预定义 的类 Exception中派生自己的子类,对无法 预测的异常也可以进行捕获和处理,克服 了传统方法中错误信息有限的问题 异常的处理借助于调用堆栈按先近后远的 原则进行
异常机制的优点 ▪ 把异常处理代码从常规代码中分离出来, 增加了可读性,方便修改 ▪ 按异常类型和差别进行分组,即从预定义 的类Exception中派生自己的子类,对无法 预测的异常也可以进行捕获和处理,克服 了传统方法中错误信息有限的问题 ▪ 异常的处理借助于调用堆栈按先近后远的 原则进行
异常传播方式 method4 探测抛出异常 method 3 用 传递 method2 method 1 捕获处理异常
异常传播方式 method1 method2 method3 method4 探测抛出异常 传 递 捕获处理异常 调 用
异常层次结构 Object Exceptions are Objects Problems I Throwable Un Checked Error Exception VirtualMachine Error RuntimeException StackOverflowErrot NullPointerException OutofMemory Error ArithmeticException IndexOutOfBounds Exception ClassNotFound Exception h Checked (at compile time DataF ormat Exception
异常层次结构
使用异常机制情况 ■当方法因为自身无法控制的原因而不能完 成其任务 文件不存在,网络连接无法建立等 ■处理在方法、类库、类中抛出的异常 如 FilelnputStream. read产生 EXception; 在大的项目中采用统一的方式处理异常时 编写文字处理器一类的程序等; 不经常发生但却可能发生的故障
使用异常机制情况 ▪ 当方法因为自身无法控制的原因而不能完 成其任务 ▪ 文件不存在,网络连接无法建立等 ▪ 处理在方法、类库、类中抛出的异常 ▪ 如FileInputStream.read产生IOException; ▪ 在大的项目中采用统一的方式处理异常时 ▪ 编写文字处理器一类的程序等; ▪ 不经常发生但却可能发生的故障
异常示例 ■简单扩展前面使用过的程序1-1的 Hello worldApp. java程序,循环打印一些信 息。程序执行到第4次循环时,会发生异常 代码见程序6-1 命令提示符 D: \java\progran\chapter6>javac HelloWorld.java D:\java\program\chapter6)java HelloWorld Hello world! No, I mean it! HELLO WORLD!! Exception in thread"main"java. lang. ArrayIndexOutof Bounds Exception: 3 at He lloWorld main<He lloWorld java: 13)
异常示例 ▪ 简单扩展前面使用过的程序1-1的 HelloWorldApp.java程序,循环打印一些信 息。程序执行到第4次循环时,会发生异常 代码见程序6-1
异常处理 try, catch和fnll语句 ∥此处为抛出具体异常的代码 catch(ExceptionTypel e)( ∥抛出 Exception Type异常时要执行的代码 I catch(Exception Type2 e) ∥抛出 Exception Type2异常时要执行的代码 I catch(Exception Typek e)( ∥抛出 Exception Typek异常时要执行的代码 I finally i ∥必须执行的代码 例6-3
异常处理 ▪ try,catch和finally语句 ▪ 例6-3 try { // 此处为抛出具体异常的代码 } catch (ExceptionType1 e) { // 抛出ExceptionType1异常时要执行的代码 } catch (ExceptionType2 e) { // 抛出ExceptionType2异常时要执行的代码 ... } catch (ExceptionTypek e) { // 抛出ExceptionTypek异常时要执行的代码 }finally { // 必须执行的代码 }