版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章
异常处理
教学目标异常处理概述
异常分类
异常的捕获处理
重新抛出异常
异常对象的生成
重新抛出异常对象
定义新的异常类型
10.1异常处理概述异常(Exception):是指程序在运行过程中出现的不正常情况或错误。如除0溢出、数组越界、文件找不到等,这些错误的发生将阻止程序的正常运行。当出现异常情况时,一个Exception对象就产生了,并交由异常处理程序处理,异常处理程序是使程序得以恢复正常运行的处理过程。10.1异常处理概述(续)Java的异常处理机制描述如下:在一个方法的运行过程中,如果发生了异常,l
则这个方法(或者是Java虚拟机)生成一个代表该异常的对象(它包含了异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。l
运行时系统寻找相应的代码来处理这一异常,系统在方法的调用栈中查找,从产生异常的方法开始进行回朔,沿着被调用的顺序往前寻找,直到找到包含相应异常处理的方法为止。其过程如图10-1所示。这一过程称为捕获(catch)一个异常。l
如该异常未进行成功捕获,则程序将终止运行。10.1异常处理概述(续)图10-1捕获异常方法调用method1method2method3method4产生异常处理异常传递异常例10-1一个未被捕获的异常:被零除//Exc0.javaclassExc0{ publicstaticvoidmain(Stringargs[]){intd=0;inta=42/d;}}
10.2异常分类Java的异常是一个对象,所有的异常都直接或间接地继承Throwable类。Throwable类的继承层次结构如下:ThrowableExceptionErrorRuntimeExceptionIOException10.2异常分类(续)Throwable类是所有异常的超类。它有两个子类Error和Exception。Error类及其子类由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等。Java程序不应捕获这些异常。Exception类及其子类(RuntimeException和IOException)代表Java程序中可能发生的异常,并且应用程序可以捕获这些异常。Java将异常分为两种类型:编译时检查性异常(checkedexception)非检查性异常(uncheckedexception,又称运行时异常).10.2异常分类(续)除了Java类库所定义的异常类之外,用户也可以通过继承已有的异常类(一般从Throwable类或Exception类继承)来定义自己的异常类,并在程序中使用(利用throw产生,catch捕捉)。10.2异常分类(续)常见的异常有:ArithmeticException:算术运算溢出。如除数为零ArrayIndexOutOfBandsException:数组下标越界异常。ArrayStoreException:数组储存异常。数组复制时,若源数组和目标数组的类型不一致时,导致异常。NullPointerException:空指针异常。NumberFormatException:数据格式异常。将字符串(含有非数字)直接转换成数值时产生。OutOfMemoryException:内存溢出异常。在创建一个对象时,由于申请的内存空间过大,导致系统内存不够。IOException:输入/输出中的异常。FileNotFoundException:文件找不到异常。NoClassDefFoundException:没有找到类定义时的异常。
10.3异常的捕获处理异常处理块的一般形式:try{
//接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理;}catch(要处理的异常类型和标识符){
//捕获(catch)一个异常并进行异常处理;}catch(要处理的异常类型和标识符){
//捕获(catch)一个异常并进行异常处理;;}…finally{
//最终处理;}10.3异常的捕获处理(续)1、try语句捕获异常的第一步就是用try{…}语句指定一段代码,该段代码就是一次捕获并处理异常的范围。在执行过程中,该段代码可能会产生并抛出一个或多个异常,因此,它后面的catch语句进行捕获时也要做相应的处理。2、catch语句每个try语句必须伴随一个或多个catch语句,用于捕获try代码块所产生的异常并做相应的处理。catch语句有一个形式参数,用于指明其所能捕获的异常类型,运行时系统通过参数值把被抛出的异常对象传递给catch语句。
当用多个catch语句时,需要记住:异常子类必须在它们任何父类之前使用
publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("test1.txt");intb;while((b=fis.read())!=-1){ System.out.print(b);}fis.close();
}catch(FileNotFoundExceptione){…}catch(IOExceptione){…}}}异常子类必须在它们任何父类之前使用10.3异常的捕获处理(续)
3、finally语句
无论try所指定的程序块中抛出或不抛出异常,也无论catch语句的异常类型是否与所抛出的异常类型一致,finally所指定的代码都要被执行,它提供了统一的出口。
通常在finally语句中可以进行资源的清除工作,如关闭打开的文件等。finally在文件处理时非常有用,例如:try{对文件进行处理的程序;}catch(IOExceptione){//对文件异常进行处理;}finally{//不论是否发生异常,都关闭文件;}注意:在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译10.4重新抛出异常异常对象的生成重新抛出异常对象10.4.1异常对象的生成Java中异常对象生成的方式:(1)
由Java虚拟机生成;(2)
或由Java类库中的某些类生成;(3)
或在程序中生成自己的异常对象。即异常可以不是出错产生,而是人为地抛出。不论那种方式,生成异常对象都是通过throw语句实现的例如:thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();throwe;注意:抛出的异常必须是Throwable或其子类的实例。10.4.1异常对象的生成(续)例10-3抛出三个异常类型的对象并捕获处理程序抛出了ArithmeticException,ArrayIndexOutOfBoundsException和StringIndexOutOfBoundsException三个异常类型的对象,并通过catch语句对三种异常对象进行了捕获处理。
classJavaThrow{publicstaticvoidmain(Stringargs[]){try{thrownewArithmeticException();}catch(ArithmeticExceptionae){System.out.println(ae);}try{thrownewArrayIndexOutOfBoundsException();}catch(ArrayIndexOutOfBoundsExceptionai){System.out.println(ai);}try{thrownewStringIndexOutOfBoundsException();}catch(StringIndexOutOfBoundsExceptionsi){System.out.println(si);}}}10.4.2重新抛出异常对象throws重新抛出异常对象首先必须先生成异常。如果在一个方法中生成了异常,但是该方法并不处理它自己产生的异常,而是沿着调用层次向上传递,由调用它的方法或方法栈来处理这些异常,这叫重新抛出异常。方法调用method1method2method3method4产生异常处理异常传递异常10.4.2重新抛出异常对象(续)重新抛出异常对象的方法是在产生异常的方法名后面加上要抛出(throws)的异常列表:
returnTypemethodName([paramlist])throwsexceptionList例如:类FileInputStream中的read()方法是这样定义的:publicintread()throwsIOException{…}
10.4.2重新抛出异常对象(续)例10-4重新抛出异常对象程序执行时,要求用户从键盘输入一个字符号。当输入‘0’时,程序执行结果如左图所示;当输入非‘0’字符时,程序执行结果如右图所示。importjava.io.*;classJavaThrows{publicintcompute(intx)throwsArithmeticException{intz=10/x;//可能抛出异常类型ArithmeticException的对象returnz;}publicvoidmethod1(){intx;try{x=System.in.read();//可能抛出异常类型IOException的对象;x=x-48;x=compute(x);//抛出异常类型ArithmeticException的对象
System.out.println(x);}catch(IOExceptionioe){//捕获异常类型IOException的对象;System.out.println("readerror");}catch(ArithmeticExceptione){//捕获异常类型ArithmeticException的对象System.out.println("devidedby0");}}publicstaticvoidmain(Stringargs[]){ JavaThrowst1=newJavaThrows();t1.method1();}}10.5定义新的异常类型自定义异常类必须继承自Throwable或Exception类,建议用Exception类。一般不把自定义异常作为Error的子类,因为Error通常被用来表示系统内部的严重故障。当自定义异常是从RuntimeException及其子类继承而来时,该自定义异常是运行时异常,程序中可以不捕获和处理它。当自定义异常是从Throwable、Exception及其子类继承而来时,该自定义异常是编译时异常,也即程序中必须捕获并处理它。
10.5定义新的异常类型(续)自定义异常同样要用try-catch-finally形式捕获处理,但异常对象必须由用户自己抛出(throw)。自定义异常的一般形式:classMyExceptionextendsException{…}10.5定义新的异常类型(续)例10-5计算两个数之和,当任意一个数超出范围(10,20)时,抛出自己的异常。
//声明一个新的异常//NewException.javaclassNumberRangeExceptionextendsException{publicNumberRangeException(Stringmsg){super(msg);}}//throws重新抛出异常NumberRangeExceptionpublicintCalcAnswer(Stringstr1,Stringstr2)
throwsNumberRangeException{intint1,int2;intanswer=-1;try{int1=Integer.parseInt(str1);//可能产生异常对象NumberFormatExceptioneint2=Integer.parseInt(str2);//可能产生异常对象NumberFormatExceptioneif((int1<10)||(int1>20)||(int2<10)||(int2>20)){NumberRangeExceptione=newNumberRangeException("Numbersarenotwithinthespecifiedrange.");throwe;//抛出自定义异常对象NumberRangeExceptione}answer=int1+int2;}catch(NumberFormatExceptione){//捕获异常对象NumberRangeExceptioneSystem.out.println(e.toString());}returnanswer;}//在调用方法getAnswer中捕获异常publicvoidgetAnswer(){StringanswerStr;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 精细木工管理综合强化考核试卷含答案
- 井下机车运输工安全知识考核试卷含答案
- 光缆护套工变更管理知识考核试卷含答案
- 耐火纤维制品整型工QC管理考核试卷含答案
- 飞机雷达罩测试工岗前激励考核试卷含答案
- 2025年防城港市东兴市四年级数学下学期期中质量检测模拟试题(含解析)
- 2026临床医学期末复习-卫生学(定向)历年题库含答案详解
- 过氧化叔丁基新戊酸酯安全技术说明书
- 2025年辽阳县数学三年级下学期期中教学质量检测试题(含解析)
- 物联网热量表数据云端传输的稳定性优化与安全防护方案
- 2025年内燃机车钳工(高级)职业技能鉴定参考试题库(含答案)
- Z-扫描光学非线性表征技术
- 《诚信管理体系培训》课件
- 个人委托投资合同范本
- 社保局授权委托书范文(2篇)
- 浙江健立化学有限公司年产2万吨六氟磷酸锂、5000吨双氟磺酰亚胺锂、2000吨碳酸亚乙烯酯、5万吨锂电池电解液新能源材料建设项目环评报告
- SCR脱硝工艺计算书
- 教育部首批中等职业学校专业教学标准
- RITTAL威图空调中文说明书
- 《红楼梦》(教学讲解课件)
- 中水回用深度处理系统操作规程
评论
0/150
提交评论