第6章 异常处理讲稿
- 格式:doc
- 大小:86.50 KB
- 文档页数:13
第6章异常处理6.1 异常处理6.1.1案例6-1 字符数组越界异常【案例简介】从键盘读入8个字符放入一个字符串数组,并在屏幕上显示,字符串长度如果超过8个显示数组越界异常。
【案例目的】掌握Java异常处理原理及流程。
【运行界面】【技术要点】使用字符输入流从键盘读入字符串,并通过字符串处理的方法,把字符串转换为单个字符。
【代码分析】import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class InputDim{public static String input(){String result=null;try{BufferedReader in = new BufferedReader(new InputStreamReader(System.in));result = in.readLine();}catch (IOException e){System.out.println("IO exception!!!");}return (result);}public static void main(String[] args){int i;char dim[] = new char[8];String buffer;try{System.out.print("请输入字符:");buffer=input();for(i=0;i<buffer.length();i++)dim[i] = buffer.charAt(i);System.out.println("输入的字符序列为:"+buffer);}catch (ArrayIndexOutOfBoundsException e){System.out.println("出现异常:数组越界!!!");}}【相关知识】1. 什么是异常异常指的是程序运行时出现的非正常情况,它中断指令的正常执行。
Java中提供了一种独特的处理异常的机制,通过异常来处理程序运行中出现的错误。
2. 异常的类型在异常类层次的最上层有一个单独的类叫做Throwable。
这个类用来表示所有的异常情况。
每个异常类型都是Throwable的子类。
Throwable有两个直接的子类。
一类是Exception,是用户程序能够捕捉到的异常情况。
我们将通过产生它的子类来创建自己的异常。
另一类是Error,它定义了那些通常无法捕捉到的异常。
要谨慎使用Error子类,因为它们通常会导致灾难性的失败。
在Exception中有一个子类RuntimeException,它是程序运行时自动地对某些错误作出反应而产生的。
表6-1常见的异常类工具包提供了一套与本地图形界面进行交互的接口。
3. 异常的处理机制Java异常的处理采用一个统一的和相对简单的抛出和处理错误的机制。
如果一个方法本身能引发异常,当所调用的方法出现异常时,调用者可以捕获异常使之得到处理;也可以回避异常,这时异常将在调用的堆栈中向下传递,直到被处理。
(1)处理异常的方式Java 中可用于处理异常的两种方式是:自行处理可能引发异常的语句封入在 try 块内,而处理异常的相应语句则封入在 catch 块内。
回避异常在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,必须由调用者处理。
(2)处理异常的程序结构try {//程序块}catch (ExceptionType1 e){// 对ExceptionType1的处理}catch (ExceptionType2 e){// 对ExceptionType2的处理throw(e); //再抛出这个“异常”}finally { }}try捕获异常的第一步是用try{…}选定捕获异常的范围,由try所限定的代码块中的语句在执行过程中可能会产生并抛出异常。
catchtry代码块可以伴随一个或多个catch语句,用于处理try代码块中所产生的异常事件。
catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛出的异常对象传递给catch块。
在catch块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的变量或调用它的方法。
getMessage( )是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace( ),用来跟踪异常事件发生时执行堆栈的内容。
单个代码片段可能会引起多个错误。
可提供多个 catch 块分别处理各种异常类型。
捕获的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。
因此,在安排catch 语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。
也就是一般先安排子类,再安排父类。
下面是一个有两个catch子句的程序的例子。
class MultiCatch {public static void main(String args[]) {try {int a = args.length;System.out.println("a = " + a);int b = 62/a;int c[] = {1};c[62] = 99;}catch(ArithmeticException e){System.out.println("div by 0: " + e);}catch(ArrayIndexOutOfBoundsException e){System.out.println("array index oob: " + e); }}}在运行这段程序时,如果给参数,将会引起一个0做除数的异常,因为a的值为0。
如果我们提供一个命令行参数,将不会产生这个异常,因为a的值大于0。
但会引起一个ArrayIndexOutOfBoundException 的异常,因为整型数组c的长度是1,却给c[62]赋值。
下面是以上两种情况的运行结果:C:\>java MultiCatch a = 0 div by 0: ng.arithmeticexception: / by zeroC:\>java MutiCatch 1 a = 1 array index oob: ng.ArrayIndexOutOfBoundsException:62finally捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。
不论在try代码块中是否发生了异常事件,finally 块中的语句都会被执行。
6.2 自定义异常6.2.1案例6-2计算阶乘【案例简介】阶乘计算程序,要计算的数从键盘输入,并在程序中处理以下异常,输入的为实数、输入的是16进制数,输入超出范围。
【案例目的】掌握自定义异常的使用与处理方法。
【运行界面】【技术要点】异常的处理优先级。
【代码分析】import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class jiecheng{public static long CalculateJieCheng(long n) // 递归计算阶乘{long result;if (n==1) result=1;else result = CalculateJieCheng(n-1)*n;return result;}public static long input() //从键盘输入要计算的数{long result=0;String input;try{BufferedReader in = new BufferedReader(new InputStreamReader(System.in));input = in.readLine();result=Long.parseLong(input);if (result>10) throw new MyException();}catch (IOException e) //IO异常{System.out.println("IO exception!!!");}catch (NumberFormatException e){int search=0;search=e.getMessage().indexOf("0x");if (search==-1)System.out.println("[出现异常]:输入的非整形错误,输入为实数");elseSystem.out.println("[出现异常]:错误输入0x开头的 16 进制数");System.exit(0);}catch (MyException e){System.out.println("[出现异常]:输入数超出范围");System.exit(0);}return (result);}public static void main(String[] args){System.out.print("请输入要结算的阶乘数:");System.out.println("结果是:"+ CalculateJieCheng(input()));}}class MyException extends Exception{}【应用扩展】异常分运行时异常和非运行时异常,运行时异常是由Java运行时系统在程序的运行过程中检测到的,而且数目可能很大。
Java编译器并不要求程序对这类异常进行处理。
非运行时异常,是用户自定义的异常,它是Exception类或它的某个字类的子类,这类异常在错误发生时无法自动抛出,而是用户设计代码创建对应的对象,并用throw语句抛出。
【相关知识】1.如何抛出异常(1)声明抛出异常如果在一个方法中生成了一个异常,但是这个方法并不确切地知道该如何对这一异常事件进行处理,这时,该方法就可以声明抛出异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。
声明抛出异常是在一个方法声明中的throws子句中指明的。