1、教学目标教学目标n异常处理概述n异常分类n异常的捕获处理n重新抛出异常n异常对象的生成n重新抛出异常对象n定义新的异常类型 10.1 异常处理概述异常处理概述n异常异常(Exception):是指程序在运行过程中出现的不正常情况或错误。如除0溢出、数组越界、文件找不到等,这些错误的发生将阻止程序的正常运行。n当出现异常情况时,一个Exception对象就产生了,并交由异常处理程序处理,异常处理程序是使程序得以恢复正常运行的处理过程。10.1 异常处理概述异常处理概述(续续)Java的异常处理机制描述如下:在一个方法的运行过程中,如果发生了异常,l则这个方法(或者是Java虚拟机)生成一个代表该
2、异常的对象(它包含了异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛出抛出(throw)一个一个异常异常。l运行时系统寻找相应的代码来处理这一异常,系统在方法的调用栈中查找,从产生异常的方法开始进行回朔,沿着被调用的顺序往前寻找,直到找到包含相应异常处理的方法为止。其过程如图10-1所示。这一过程称为捕获捕获(catch)一个异常。l如该异常未进行成功捕获,则程序将终止运行。10.1 异常处理概述异常处理概述(续续)图10-1 捕获异常方法调用method1method2method3method4产生异常处理
3、异常传递异常例例10-1 10-1 一个未被捕获的异常:被零除一个未被捕获的异常:被零除/Exc0.javaclass Exc0 public static void main(String args)int d=0;int a=42/d;程序修改为提供捕获“被零除”的异常处理。只需要把所要监控的代码放进一个try块就可以了。紧跟着try块的,是包括一个说明捕获的错误类型的catch子句。例例10-2 一个一个被捕获的异常:被捕获的异常:被零除被零除/Exc2.jaa/Exc2.jaaclass Exc2 class Exc2 public static void main(String ar
4、gs)public static void main(String args)int d,a;int d,a;try try /monitor a block of code./monitor a block of code.d=0;d=0;a=42/d;a=42/d;catchcatch (ArithmeticException e)(ArithmeticException e)/catch divide-by-zero error /catch divide-by-zero error System.out.println(Division by zero.);System.out.pri
5、ntln(Division by zero.);System.out.println(After catch statement.);System.out.println(After catch statement.);程序运行将正常结束,并显示出如下信息:10.2 10.2 异常分类异常分类nJava的异常是一个对象,所有的异常都直接或间接地继承Throwable类。Throwable类的继承层次结构如下:ThrowableThrowableExceptionErrorErrorRuntimeExceptionRuntimeExceptionIOException10.2 10.2 异常分类
6、异常分类(续续)nThrowable类是所有异常的超类。它有两个子类Error和Exception。nError类及其子类由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等。Java程序不应捕获这些异常。nException类及其子类(RuntimeException和 IOException)代表Java程序中可能发生的异常,并且应用程序可以捕获这些异常。nJava将异常分为两种类型:n编译时检查性异常(checked exception)n非检查性异常(unchecked exception,又称运行时异常).10.2 10.2 异常分类异常分类(续续)n除了Java类库所定义的异
7、常类之外,用户也可以通过继承已有的异常类(一般从Throwable类或Exception类继承)来定义自己的异常类,并在程序中使用(利用throw产生,catch捕捉)。10.2 10.2 异常分类异常分类(续续)n常见的异常常见的异常有:ArithmeticException:算术运算溢出。如除数为零 ArrayIndexOutOfBandsException:数组下标越界异常。ArrayStoreException:数组储存异常。数组复制时,若源数组和目标数组的类型不一致时,导致异常。NullPointerException:空指针异常。NumberFormatException:数据格式
8、异常。将字符串(含有非数字)直接转换成数值时产生。OutOfMemoryException:内存溢出异常。在创建一个对象时,由于申请的内存空间过大,导致系统内存不够。IOException:输入/输出中的异常。FileNotFoundException:文件找不到异常。NoClassDefFoundException:没有找到类定义时的异常。10.3 10.3 异常的捕获处理异常的捕获处理n异常处理块的一般形式:异常处理块的一般形式:try /接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理;catch(要处理的异常类型和标识符)/捕获(catch)一个异常并进行异常处理;
9、catch(要处理的异常类型和标识符)/捕获(catch)一个异常并进行异常处理;finally /最终处理;10.3 10.3 异常的捕获处理异常的捕获处理(续续)1 1、trytry语句语句 捕获异常的第一步就是用try 语句指定一段代码,该段代码就是一次捕获并处理异常的范围。在执行过程中,该段代码可能会产生并抛出一个或多个异常,因此,它后面的catch语句进行捕获时也要做相应的处理。2 2、catchcatch语句语句 每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的异常并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获的异常类型,运行时系统通过
10、参数值把被抛出的异常对象传递给catch语句。当用多个catch语句时,需要记住:异常子类必须在它们任何父类之前使用 public class ExceptionDemo public static void main(String args)try FileInputStream fis=new FileInputStream(test1.txt);int b;while(b=fis.read()!=-1)System.out.print(b);fis.close();catch(FileNotFoundException e)catch(IOException e)异常子类必须在它们任何父
11、类之前使用10.3 10.3 异常的捕获处理异常的捕获处理(续续)3 3、finallyfinally语句语句 无论无论trytry所指定的程序块中抛出或不抛出异常,也无论所指定的程序块中抛出或不抛出异常,也无论catchcatch语句的语句的异常类型是否与所抛出的异常类型一致,异常类型是否与所抛出的异常类型一致,finallyfinally所指定的代码都要所指定的代码都要被执行,它提供了统一的出口。被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作,如关闭打开的文件等。finally在文件处理时非常有用,例如:try 对文件进行处理的程序;catch(IOExcep
12、tion e)/对文件异常进行处理;finally /不论是否发生异常,都关闭文件;注意:在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译注意:在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译10.4 10.4 重新抛出异常重新抛出异常n异常对象的生成异常对象的生成n重新抛出异常对象重新抛出异常对象10.4.1 10.4.1 异常异常对象的生成对象的生成Java中异常对象生成的方式:(1)由Java虚拟机生成;(2)或由Java类库中的某些类生成;(3)或在程序中生成自己的异常对象。即异常可以不是出错产生,而是人为地抛出。不论那种方式,生成异常对象都是通过throw语句
13、实现的例如:throw new ThrowableObject();ArithmeticException e=new ArithmeticException();throw e;注意:抛出的异常必须是Throwable或其子类的实例。10.4.1 10.4.1 异常对象的生成异常对象的生成(续续)例例10-3 10-3 抛出三个异常类型的对象并抛出三个异常类型的对象并捕获处理捕获处理 程序抛出了ArithmeticException,ArrayIndexOutOfBoundsException 和StringIndexOutOfBoundsException三个异常类型的对象,并通过catc
14、h语句对三种异常对象进行了捕获处理。class JavaThrow public static void main(String args)try throw new ArithmeticException();catch(ArithmeticException ae)System.out.println(ae);try throw new ArrayIndexOutOfBoundsException();catch(ArrayIndexOutOfBoundsException ai)System.out.println(ai);try throw new StringIndexOutOfBo
15、undsException();catch(StringIndexOutOfBoundsException si)System.out.println(si);10.4.2 10.4.2 重新抛出异常对象重新抛出异常对象 throwsn重新抛出异常对象首先必须先生成异常。n如果在一个方法中生成了异常,但是该方法并不处理它自己产生的异常,而是沿着调用层次向上传递,由调用它的方法或方法栈来处理这些异常,这叫重新抛出异常重新抛出异常。方法调用method1method2method3method4产生异常处理异常传递异常10.4.2 10.4.2 重新抛出异常对象重新抛出异常对象(续续)n重新抛出异
16、常对象的方法是在产生异常的方法名后面加上要抛出(throws)的异常列表:returnType methodName(paramlist)throws exceptionList例如:类FileInputStream中的read()方法是这样定义的:publicintread()throwsIOExceptionn10.4.2 10.4.2 重新抛出异常对象重新抛出异常对象(续续)例10-4 重新抛出异常对象程序执行时,要求用户从键盘输入一个字符号。当输入0时,程序执行结果如左图所示;当输入非0字符时,程序执行结果如右图所示。import java.io.*;class JavaThrows
17、public int compute(int x)throws ArithmeticException int z=10/x;/可能抛出异常类型ArithmeticException 的对象 return z;public void method1()int x;try x=System.in.read();/可能抛出异常类型IOException的对象;x=x-48;x=compute(x);/抛出异常类型ArithmeticException的对象 System.out.println(x);catch(IOException ioe)/捕获异常类型IOException的对象;Syste
18、m.out.println(read error);catch(ArithmeticException e)/捕获异常类型ArithmeticException的对象 System.out.println(devided by 0);public static void main(String args)JavaThrows t1=new JavaThrows();t1.method1();10.5 10.5 定义新的异常类型定义新的异常类型n 自定义异常类必须继承自Throwable或Exception类,建议用Exception类。一般不把自定义异常作为Error的子类,因为Error通常
19、被用来表示系统内部的严重故障。n当自定义异常是从RuntimeException及其子类继承而来时,该自定义异常是运行时异常,程序中可以不捕获和处理它。n 当自定义异常是从Throwable、Exception及其子类继承而来时,该自定义异常是编译时异常,也即程序中必须捕获并处理它。10.5 10.5 定义新的异常类型定义新的异常类型(续续)n自定义异常同样要用try-catch-finally形式捕获处理,但异常对象必须由用户自己抛出(throw)。自定义异常的一般形式:class MyException extends Exceptionclass MyException extends
20、Exception 10.5 10.5 定义新的异常类型定义新的异常类型(续续)例例10-5 10-5 计算两个数之和,当任意一个数超出范围(计算两个数之和,当任意一个数超出范围(1010,2020)时,抛出自己的异常。时,抛出自己的异常。/声明一个新的异常/NewException.java class NumberRangeException extends Exception public NumberRangeException(String msg)super(msg);/throws重新抛出异常NumberRangeExceptionpublic int CalcAnswer(St
21、ring str1,String str2)throws NumberRangeException int int1,int2;int answer=-1;try int1=Integer.parseInt(str1);/可能产生异常对象NumberFormatException e int2=Integer.parseInt(str2);/可能产生异常对象NumberFormatException e if(int1 20)|(int2 20)NumberRangeException e=new NumberRangeException (Numbers are not within the
22、 specified range.);throw e;/抛出自定义异常对象NumberRangeException e answer=int1+int2;catch(NumberFormatException e)/捕获异常对象NumberRangeException e System.out.println(e.toString();return answer;/在调用方法getAnswer中捕获异常 public void getAnswer()String answerStr;try int answer=CalcAnswer(12,5);/抛出异常对象NumberRangeExcept
23、ion e answerStr=String.valueOf(answer);catch(NumberRangeException e)/捕获异常对象NumberRangeException e answerStr=e.getMessage();System.out.println(answerStr);public static void main(String args)NewException t1=new NewException();t1.getAnswer();小结小结nJava通过面向对象的方法进行异常处理,把各种不同的异常事件进行分类,由于把异常事件当成对象来处理,利用类的层次性可以把多个具有相同父类的异常统一处理,也可以区分不同的异常分别处理,使用非常灵活。n应该根据具体的情况选择在何处处理异常。或者在方法内捕获并处理,或者用throws子句把它交给调用栈中上层的方法去处理。n对非运行时异常必须捕获或声明。对运行时异常,若不能预测它何时发生,程序可不作处理,而是交给Java运行时系统来处理。n异常可以是系统已经定义好的,也可以是用户自己定义的。异常可人为地抛出,用throw new 语句。n使用finally语句为异常处理提供统一的出口。作业书上本章习题中:245.6
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。