版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章第十章 异异 常常 处处 理理 2教学目标教学目标n异常处理概述n异常分类n异常的捕获处理n重新抛出异常n异常对象的生成n重新抛出异常对象n定义新的异常类型 310.1 异常处理概述异常处理概述n异常异常(Exception):是指程序在运行过程中出现的不正常情况或错误。 如除0溢出、数组越界、文件找不到等,这些错误的发生将阻止程序的正常运行。n当出现异常情况时,一个Exception对象就产生了,并交由异常处理程序处理,异常处理程序是使程序得以恢复正常运行的处理过程。410.1 异常处理概述异常处理概述(续续) Java的异常处理机制描述如下:在一个方法的运行过程中,如果发生了异常,l
2、则这个方法(或者是Java虚拟机)生成一个代表该异常的对象(它包含了异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛出抛出(throw)一个一个异常异常。l运行时系统寻找相应的代码来处理这一异常,系统在方法的调用栈中查找,从产生异常的方法开始进行回朔,沿着被调用的顺序往前寻找,直到找到包含相应异常处理的方法为止。其过程如图10-1所示。这一过程称为捕获捕获(catch)一个异常。l如该异常未进行成功捕获,则程序将终止运行。510.1 异常处理概述异常处理概述(续续)图10-1 捕获异常方法调用method1me
3、thod2method3method4产生异常处理异常传递异常6例例10-1 10-1 一个未被捕获的异常:被零除一个未被捕获的异常:被零除/Exc0.javaclass Exc0 public static void main(String args) int d = 0; int a = 42 / d; 7程序修改为提供捕获“被零除”的异常处理。只需要把所要监控的代码放进一个try块就可以了。紧跟着try块的,是包括一个说明捕获的错误类型的catch子句。例例10-2 一个一个被捕获的异常:被捕获的异常:被零除被零除/Exc2.jaaExc2.jaaclass Exc2 class Exc
4、2 public static void main(String args public static void main(String args) ) intint d, a; 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(ArithmeticException e) e) /catch divide-by-zero error /catch divide-by-zer
5、o error System.out.println System.out.println(Division by zero.);(Division by zero.); System.out.println System.out.println(After catch statement.);(After catch statement.); 8程序运行将正常结束,并显示出如下信息:9 10.2 10.2 异常分类异常分类nJava的异常是一个对象,所有的异常都直接或间接地继承Throwable类。Throwable类的继承层次结构如下:ThrowableThrowableException
6、ErrorErrorRuntimeExceptionRuntimeExceptionIOException1010.2 10.2 异常分类异常分类(续续)nThrowable类是所有异常的超类。它有两个子类Error和Exception。nError类及其子类由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等。Java程序不应捕获这些异常。nException类及其子类(RuntimeException和 IOException)代表Java程序中可能发生的异常,并且应用程序可以捕获这些异常。nJava将异常分为两种类型:n编译时检查性异常(checked exception)n非检查
7、性异常(unchecked exception,又称运行时异常). 1110.2 10.2 异常分类异常分类(续续)n除了Java类库所定义的异常类之外,用户也可以通过继承已有的异常类(一般从Throwable类或Exception类继承)来定义自己的异常类,并在程序中使用(利用throw产生,catch捕捉)。1210.2 10.2 异常分类异常分类(续续)n常见的异常常见的异常有: ArithmeticException:算术运算溢出。如除数为零 ArrayIndexOutOfBandsException:数组下标越界异常。 ArrayStoreException:数组储存异常。数组复制时
8、,若源数组和目标数组的类型不一致时,导致异常。 NullPointerException:空指针异常。 NumberFormatException:数据格式异常。将字符串(含有非数字)直接转换成数值时产生。 OutOfMemoryException:内存溢出异常。在创建一个对象时,由于申请的内存空间过大,导致系统内存不够。 IOException:输入/输出中的异常。 FileNotFoundException:文件找不到异常。 NoClassDefFoundException:没有找到类定义时的异常。 1310.3 10.3 异常的捕获处理异常的捕获处理n异常处理块的一般形式:异常处理块的一
9、般形式:try /接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理;catch(要处理的异常类型和标识符) /捕获(catch)一个异常并进行异常处理;catch(要处理的异常类型和标识符) /捕获(catch)一个异常并进行异常处理;finally /最终处理;1410.3 10.3 异常的捕获处理异常的捕获处理(续续)1 1、trytry语句语句 捕获异常的第一步就是用try 语句指定一段代码,该段代码就是一次捕获并处理异常的范围。在执行过程中,该段代码可能会产生并抛出一个或多个异常,因此,它后面的catch语句进行捕获时也要做相应的处理。2 2、catchcatch语
10、句语句 每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的异常并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获的异常类型,运行时系统通过参数值把被抛出的异常对象传递给catch语句。 当用多个catch语句时,需要记住:异常子类必须在它们任何父类之前使用 15public class ExceptionDemo public static void main(String args) try FileInputStream fis = new FileInputStream(test1.txt); int b; while( (b=fis.read()
11、!=-1 ) System.out.print(b); fis.close(); catch(FileNotFoundException e) catch(IOException e) 异常子类必须在它们任何父类之前使用1610.3 10.3 异常的捕获处理异常的捕获处理(续续) 3 3、finallyfinally语句语句 无论无论trytry所指定的程序块中抛出或不抛出异常,也无论所指定的程序块中抛出或不抛出异常,也无论catchcatch语句的语句的异常类型是否与所抛出的异常类型一致,异常类型是否与所抛出的异常类型一致,finallyfinally所指定的代码都要所指定的代码都要被执行,
12、它提供了统一的出口。被执行,它提供了统一的出口。 通常在finally语句中可以进行资源的清除工作,如关闭打开的文件等。finally在文件处理时非常有用,例如:try 对文件进行处理的程序;catch(IOException e) /对文件异常进行处理;finally /不论是否发生异常,都关闭文件;注意:在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译注意:在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译1710.4 10.4 重新抛出异常重新抛出异常n异常对象的生成异常对象的生成n重新抛出异常对象重新抛出异常对象1810.4.1 10.4.1 异常异常对象的生成对
13、象的生成Java中异常对象生成的方式: (1)由Java虚拟机生成; (2)或由Java类库中的某些类生成; (3)或在程序中生成自己的异常对象。即异常可以不是出错产生,而是人为地抛出。不论那种方式,生成异常对象都是通过throw语句实现的例如: throw new ThrowableObject(); ArithmeticException e = new ArithmeticException(); throw e;注意:抛出的异常必须是Throwable或其子类的实例。19例例10-3 10-3 抛出三个异常类型的对象并抛出三个异常类型的对象并捕获处理捕获处理 程序抛出了Arithmet
14、icException,ArrayIndexOutOfBoundsException 和StringIndexOutOfBoundsException三个异常类型的对象,并通过catch语句对三种异常对象进行了捕获处理。 20class JavaThrow public static void main(String args) try throw new ArithmeticException(); catch(ArithmeticException ae) System.out.println(ae); try throw new ArrayIndexOutOfBoundsExceptio
15、n(); catch(ArrayIndexOutOfBoundsException ai) System.out.println(ai); try throw new StringIndexOutOfBoundsException(); catch(StringIndexOutOfBoundsException si) System.out.println(si); 2110.4.2 10.4.2 重新抛出异常对象重新抛出异常对象 throwsn重新抛出异常对象首先必须先生成异常。n如果在一个方法中生成了异常,但是该方法并不处理它自己产生的异常,而是沿着调用层次向上传递,由调用它的方法或方法栈
16、来处理这些异常,这叫重新抛出异常重新抛出异常。方法调用method1method2method3method4产生异常处理异常传递异常2210.4.2 10.4.2 重新抛出异常对象重新抛出异常对象(续续)n重新抛出异常对象的方法是在产生异常的方法名后面加上要抛出(throws)的异常列表: returnType methodName(paramlist) throws exceptionList例如:类FileInputStream中的read()方法是这样定义的:publicintread()throwsIOExceptionn2310.4.2 10.4.2 重新抛出异常对象重新抛出异常对
17、象(续续)例10-4 重新抛出异常对象程序执行时, 要求用户从键盘输入一个字符号。当输入0时,程序执行结果如左图所示;当输入非0字符时,程序执行结果如右图所示。24import java.io.*;class JavaThrows 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的
18、对象; x=x-48; x=compute(x); /抛出异常类型ArithmeticException的对象 System.out.println(x); catch(IOException ioe) /捕获异常类型IOException的对象; System.out.println(read error); catch(ArithmeticException e) /捕获异常类型ArithmeticException的对象 System.out.println(devided by 0); 25public static void main(String args) JavaThrows
19、t1=new JavaThrows(); t1.method1(); 2610.5 10.5 定义新的异常类型定义新的异常类型n 自定义异常类必须继承自Throwable或Exception类,建议用Exception类。一般不把自定义异常作为Error的子类,因为Error通常被用来表示系统内部的严重故障。n当自定义异常是从RuntimeException及其子类继承而来时,该自定义异常是运行时异常,程序中可以不捕获和处理它。n 当自定义异常是从Throwable、Exception及其子类继承而来时,该自定义异常是编译时异常,也即程序中必须捕获并处理它。2710.5 10.5 定义新的异常
20、类型定义新的异常类型(续续)n自定义异常同样要用try-catch-finally形式捕获处理,但异常对象必须由用户自己抛出(throw)。自定义异常的一般形式:class MyExceptionclass MyException extends Exception extends Exception 2810.5 10.5 定义新的异常类型定义新的异常类型(续续)例例10-5 10-5 计算两个数之和,当任意一个数超出范围(计算两个数之和,当任意一个数超出范围(1010,2020)时,抛出自己的异常。时,抛出自己的异常。 29/声明一个新的异常/NewException.java class
21、 NumberRangeException extends Exception public NumberRangeException(String msg) super(msg); 30/throws重新抛出异常NumberRangeExceptionpublic int CalcAnswer(String str1, String str2) throws NumberRangeException int int1, int2; int answer = -1; try int1 = Integer.parseInt(str1); /可能产生异常对象NumberFormatExceptio
22、n e int2 = Integer.parseInt(str2); /可能产生异常对象NumberFormatException e if( (int1 20) | (int2 20) ) NumberRangeException e = new NumberRangeException (Numbers are not within the specified range.); throw e; /抛出自定义异常对象NumberRangeException e answer = int1 + int2; catch (NumberFormatException e) /捕获异常对象NumberRangeException e System.ou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年长子县教师招聘笔试备考试题及答案解析
- 2026四川巴中经济开发区人力资源和社会保障服务中心第十四批就业见习岗位需求8人笔试备考题库及答案解析
- 妇幼医学研究与科技创新中心专业技术人员招聘考试模拟试题及答案解析
- 2027中国农业发展银行浙江省分行校园招聘39人考试模拟试题及答案解析
- 2026年通榆县教师招聘笔试模拟试题及答案解析
- 2026年多伦县教师招聘笔试备考题库及答案解析
- 2026湖南长沙市望城区人力资源和社会保障局公益性岗位人员招聘考试模拟试题及答案解析
- 2026广东梅州市公安局梅江分局招聘警务辅助人员30人笔试备考题库及答案解析
- 2026年庆城县教师招聘笔试备考题库及答案解析
- 2026年大城县教师招聘笔试模拟试题及答案解析
- 2026年水务行业招聘综合知识+供排水专业知识试题卷(含参考答案及解析)
- 公共场所卫生保洁服务标准报告
- 乡镇卫生院常见病66种的临床路径及诊疗指南
- 供排水安全培训手册
- 让家更美好课件2026-2027学年统编版道德与法治七年级上册
- 2026年(完整版)国家GCP培训考试题库及参考答案(完整版)
- 中望3D建模基础教案
- Adobe Illustrator服装款式图绘制技法(第2版)
- (2026年)海姆立克法急救培训课件
- 雀巢公司员工培训
- 肿瘤患者便秘与腹泻护理要点
评论
0/150
提交评论