第八章异常处理_第1页
第八章异常处理_第2页
第八章异常处理_第3页
第八章异常处理_第4页
第八章异常处理_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章 异常处理主讲:毛科亮本章内容一、异常概述 1.1程序错误与处理。 1.2java异常处理机制二、异常类 2.1异常类的分类 2.2系统定义的异常类 2.3用户自定义的异常类 2.4受检查异常和不受检查异常三、异常的抛出 3.1系统自动抛出的异常 3.2 throw语句抛出的异常 3.3 throws子句四、异常的捕获与处理 4.1try /catch语句 4.2多异常的捕获与处理 五、异常处理的进一步讨论 5.1没有捕获到的异常 5.2 catch语句抛出的异常 5.3构造方法抛出的异常 5.4 finally语句 5.5异常处理原则 5.6异常处理机制和编程方法总结 5.7银行取款的

2、异常处理 5.8职员年龄的异常处理软件系统提供给用户的是一套完善的服务,一个能够实际运行的软件系统应该不仅具有用户需求的强大功能,还必须具有高度的可靠性、稳定性、容错性。这就要求软件系统不仅自身不能有错误,还要具备较强的抗干扰能力。即使在用户操作出现错误,或遇到不可抗拒的干扰时,软件系统也不能放弃,而必须尽最大努力排除错误继续运行。只有具备这样素质的软件系统才会具有旺盛的生命力和广泛的应用空间。一、异常概述Java语言的语法体系是严密的,语法检查是严格的,它不仅在编译时能检查出所有语法错误,更重要的是,它在运行时能捕获到所有运行时错误;Java的异常处理提供对运行时错误的语言级机制,Java的

3、内存自动管理提供内存资源使用的安全性;这些使得采用Java语言开发的软件系统具有高度的可靠性、稳定性和容错性。一、异常概述应用程序的开发过程实际上是一个不断排除错误的过程。程序中的错误有不同的性质,按照错误性质可将程序错误分成3类:语法错、逻辑错、语义错。违反语法规范的错误称为语法错(syntax error),这类错误通常在编译时发现,又称为编译错。如:标识符未声明;表达式中运算符与操作数类型不兼容、变量赋值时的类型与声明时的类型不匹配;括号不匹配;语句末尾缺少分号等。Java编译器能够发现所有语法错。一、异常概述1.1程序错误与处理如果程序通过编译、可运行,但运行结果与期望值不符,则这类错

4、误为逻辑错(logic error)。如:由于循环条件不正确而没有结果;循环次数不对导致计算结果不正确等。由于系统无法找到逻辑错,逻辑错的排除只有凭借程序员自身的经验。一、异常概述程序错误与处理当程序在语法上正确,而在运行时出现的错误为语义错(semantic error ),又称为运行错。如:数据格式错;除数为零错;给变量赋于超出范围的值、数组下标越界、文件不存在、无法连接数据库、网络连接中断等。Java解释器在程序运行时能够发现语义错。一旦发现语义错,Java将停止程序运行。有些语义错能够被程序员事先处理,如除数为零、数组下标越界等,程序中可以设法避免;有些语义错不能被程序事先处理,如待打

5、开的文件不存在、网络连接中断等,则必须进行异常处理。一、异常概述程序错误与处理class Ex8_1 static void method() int x=0,z=10;int y=10/x;System.out.println(z=+z); public static void main(String args) method();System.out.println(After method.);程序编译可通过,但运行时由系统抛出的异常,程序未能运行完毕 Exception in thread main java.lang.ArithmeticException: / by zero at

6、 Ex8_01.method(Ex8_01.java:4) at Ex8_01.main(Ex8_01.java:8)采用异常处理后,程序可以运行完成class Ex8_2 static void method() int x=0,z=10;tryint y=10/x;System.out.println(z=+z); catch(ArithmeticException e) System.out.println(ArithmeticException); System.out.println(After try/catch blocks.); public static void main(

7、String args) method();System.out.println(After method.);1.2 Java异常处理机制在面向对象程序设计思想中,程序的正确性、可靠性、稳定性比程序效率更重要。Java提供语言级的错误防范和处理机制,也就是异常处理机制,将运行时错误封装成若干错误类和异常类,并提供异常处理语句用于在程序中实现对运行时错误地发现和及时处理。异常处理是一种对异常进行事后处理的机制。从语法上看异常处理语句将程序正常代码与错误处理代码分开,是程序结构清晰,算法重点突出,可读性强;从运行效果看,异常处理语句使程序具有处理错误的能力,即使发生了运行错,应用程序能够捕获异常

8、并及时处理异常,使程序从运行错误中很好的恢复并继续运行,而不会导致程序运行非正常终止。而且,如果当前方法没有能力处理异常,还可以将异常转交给调用者处理。一、异常概述Java运行时的错误和异常Java将运行时错误分为两类:错误和异常。错误(error)指程序运行时遇到的硬件或操作系统错误,如:内存溢出、虚拟机错误等。异常(Exception)指在硬件和操作系统正常时程序遇到的运行错,如:进行数学中“无意义”的运算,例如除数为零、对负数求对数平方根等;对数组进行操作时,超出了数组的最大下标;程序所需进行的I/O操作不能正常执行,如所需访问的文件不存在;内存耗尽无法进行类的实例化;JVM崩溃;异常对

9、程序而言是非致命性的,异常处理代码可调整程序运行方向,使程序仍可继续运行。一、异常概述程序对错误与异常的处理程序不能处理错误;程序应处理编译时出现的异常;程序应处理运行时出现的异常。一、异常概述为什么要进行异常处理?异常处理是使程序从故障中恢复,它包括: 提示异常信息、不产生无效结果和释放资源三方面内容。Java语言采用面向对象的方法来处理异常。Java程序在运行过程中,如果发生一个可识别的运行错误,系统应产生一个相应的异常类对象,并进一步寻找异常处理代码来处理他,确保程序能从故障中恢复,使程序能正常运行下去,直到结束。一、异常概述Java异常处理机制(一)在Java面向对象语言中,异常处理也

10、是利用类与对象的一套机制。Java异常处理机制包括: 异常类体系 异常处理的try、catch语句 抛出自定义异常对象的throw 语句 声明方法抛出异常的throws子句 总是要执行finally子句 这些功能使得程序不仅能够捕获并处理异常,还能够主动抛出异常,也能够将异常向调用传递。一、异常概述Java程序异常一般出现在方法中。Java中方法的调用过程记录在Java虚拟机的方法调用栈中。每个线程都有一个独立的方法调用栈。如果在执行方法的过程中抛出异常,则Java虚拟机必须找到能处理异常的catch代码块。当Java虚拟机回溯到调用栈的底部方法时,如果仍然没有找到处理该异常的代码块时,按下列

11、步骤处理: 调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息。 如果该线程不是主线程,那么终止这个线程,其他线程继续正常运行。如果该线程是主线程,则整个程序被终止。一个异常处理应该完成以下三个工作: 抛出异常,即根据异常类型产生异常对象;捕获异常;处理异常。异常处理机制(二)一、异常概述方法的调用堆栈main()main()methodA()methodA()methodB()methodB()methodC()methodC()调调 用用Java程序在执行的过程中,形成了一个先进后出的调用堆栈,各方法之间依照调用先后的不同,由先至后的进入调用堆栈,堆栈的最上

12、层即是当前被调用执行的方法。该方法执行完毕后,会将处理器控制权交还给调用他的方法,依此类推。 一、异常概述方法调用堆栈中异常对象的传递 当某一方法中的一个语句抛出一个异常时,如果该方法中没有处理该异常的语句,那么该方法就会中止执行,并将这个异常传递给堆栈中的下一层方法,直到某一方法中含有处理该异常的语句为止。如果该异常被传递至主方法,而主方法中仍然没有处理该异常的语句,则异常将会被抛至JVM,程序中断。main()main()methodA()methodA()methodB()B()methodC()C()调调 用用传传 递递一、异常概述例 程public class ExampleOfEx

13、ception String lines = The first line, The second line,The last line; public static void main (String args) ExampleOfException eoe = new ExampleOfException(); eoe.methodA(); System.out.println(Program finished.); void methodA() methodB(); void methodB() methodC(); void methodC() for (int i=0; i10 )

14、throw new MyException(a); System.out.println(normal exit); public static void main( String args ) try compute( 1 ); compute( 20 ); catch( MyException e ) System.out.println(Caught +e); 程序运行结果:程序运行结果:called compute(1)called compute(1)normal exitnormal exitcalled compute(20)called compute(20)Caught My

15、Exception 20Caught MyException 20class MyExceptionClass extends Exception double x; MyExceptionClass(double x) super(输入错误!+x=+x+,当x的平方根为负数时引发了自定义异常。); this.x=x; public String toString() return MyExceptionClass:输入错误!;v只有定义了用户自定义异常类,程序才有可能去抛出这种类型的异常,进而捕获并处理这种类型的错误。class Ex8_3 static void method() doub

16、le x=-2.0;int z=10;tryif (x0)throw new MyExceptionClass(x);double y=Math.sqrt(x);System.out.println(y=+y); catch(MyExceptionClass e) System.out.println(e); / System.out.println(new Exception(输入错误!+x=+x+,当x的平方根为负数时引发了自定义异常。); System.out.println(After try/catch blocks.); public static void main(String

17、 args) method();System.out.println(After method.);ObjectThrowableErrorExceptionRuntimeException子类子类子类不受检查异常受检查异常二、异常类2.4 受检查异常与不受检查异常受检查的异常(编译时异常)在程序中必须对其进行处理,否则,编译器会指出错误。当一个方法中的代码抛出一个受检查的异常时,这个异常或者被方法中的try-catch结构捕获,或者在方法的throws语句中声明,并由他的调用者处理。两者必选其一,否则编译系统将给出错误信息。对于不受检查的异常在程序中可以不做处理,直接由运行时系统来处理。受检

18、查异常与不受检查异常异常处理的一般步骤异常抛出异常抛出异常捕获异常捕获异常处理异常处理三、异常的抛出异常的抛出Java应用程序在运行过程中如果出现一个可识别的错误,就会产生一个与该错误相对应的一个异常类对象。这个对象包含了异常的类型和错误出现时程序所处的状态信息,该异常对象首先会交给虚拟机,由虚拟机寻找具体的异常处理者。 在Java中,把产生异常对象并将其交给虚拟机的过程称为抛出异常。异常类不同,抛出异常的方法也不同,可分为:l系统自动抛出异常,一般是系统定义的异常类;lThrow语句抛出的异常,一般是用户自定义的异常,也可以是系统定义的异常。三、异常的抛出异常的捕获当一个异常被抛出时,应该有

19、专门的语句来接受这个被抛出的异常对象,这个过程称为捕获异常。要捕获一个异常,程序员只需要在程序中设置一个try-catch-finally语句,其格式如下: try 抛出异常的代码 catch (某Exception类型1 e) 处理该异常类型的代码 catch (某Exception类型2 e) 处理该异常类型的代码 . finally 总要执行的代码 .v该语句包含try、catch、finally三个子句。catch子句可以有多个,而且至少有一个catch子句或finally子句。3.1系统自动抛出的异常lJavaJava程序运行过程中,如果产生的错误是属于系统定义程序运行过程中,如果产

20、生的错误是属于系统定义异常类所对应的一个错误,则系统会自动抛出该类的异常异常类所对应的一个错误,则系统会自动抛出该类的异常对象。对象。例如:除数是例如:除数是0 0的算术运算,产生的错误对应着算术异常类的算术运算,产生的错误对应着算术异常类ArithmeticException,ArithmeticException,属于系统定义异常类,系统就会自属于系统定义异常类,系统就会自动抛出动抛出ArithmeticExceptionArithmeticException类异常对象。类异常对象。三、异常的抛出3.2 throw语句抛出的异常除过系统自动抛出异常外,方法中若需要抛出异常时,除过系统自动抛

21、出异常外,方法中若需要抛出异常时,也可使用也可使用throwthrow语句实现,具体步骤应该是:语句实现,具体步骤应该是:选择合适的异常类;选择合适的异常类;创建该类的一个对象;创建该类的一个对象;使用使用throwthrow语句抛出该对象。语句抛出该对象。ThrowThrow语句既可以抛出受检查的异常,也可以抛出不受检查的语句既可以抛出受检查的异常,也可以抛出不受检查的异常异常三、异常的抛出抛出不受检查的异常(编译可通过,运行时若不捕获则程序异常中断,若捕获则执行完毕)class PrimaryAdd public double add(double a,double b) if(a0|b0

22、)throw new ArithmeticException(a0|b0); return a+b; public class Ex8_4 public static void main(String args) PrimaryAdd obj=new PrimaryAdd();/try /无此语句编译能通过。有此语句时,程序不会中断。 System.out.println(2+3=+obj.add(2,3); System.out.println(-2+3=+obj.add(-2,3);/catch(ArithmeticException e) 抛出受检查的异常(编译不通过,若捕获则编译通过)

23、class PrimaryAdd public double add(double a,double b)if(a0|b0)throw new Exception(a0|b0); return a+b; public class Ex8_5 public static void main(String args) PrimaryAdd obj=new PrimaryAdd();System.out.println(2+3=+obj.add(2,3); System.out.println(-2+3=+obj.add(-2,3);抛出受检查的异常,捕获并处理class PrimaryAdd pu

24、blic double add(double a,double b)try if(a0|b0)throw new Exception(a0|b0); return a+b; catch(Exception e)System.out.println(输入了负数,产生了异常!+e);return 0; public class Ex8_6 public static void main(String args) PrimaryAdd obj=new PrimaryAdd();System.out.println(2+3=+obj.add(2,3); System.out.println(-2+3=

25、+obj.add(-2,3);class PrimaryAdd public double add(double a,double b)throws Exceptionif(a0|b0)throw new Exception(a0|b0); return a+b; public class Ex8_7 public static void main(String args) throws Exception PrimaryAdd obj=new PrimaryAdd();System.out.println(2+3=+obj.add(2,3); System.out.println(-2+3=

26、+obj.add(-2,3);抛出受检查的异常,声明抛出(编译可通过,但虚拟机会抛出异常) 3.3 throws子句一个方法必须通过throws语句在方法的声明部分说明它可能抛出而并未捕获的所有的“必检异常”,如果没有这么做,将不能通过编译。值得注意的是:如果在子类中覆盖了父类的某一方法,那么该子类方法不可以比被其覆盖的父类方法抛出更多的异常(但可以更少)。所以,如果被覆盖父类的方法没有抛出任何的“必检异常”,那么子类方法绝不可能抛出“必检异常”。三、异常的抛出在下面的例子里,对于父类在下面的例子里,对于父类SuperClassSuperClass而言,而言,类类SubClassASubCla

27、ssA是正确的子类,而是正确的子类,而SubClassBSubClassB则是错则是错误的。误的。 class SuperClasspublic superMethod() throws EOFException class SubClassA extends SuperClass /正确正确public superMethod() class SubClassB extends SuperClass/错误错误public superMethod() throws FileNotFoundException三、异常的抛出throws子句声明异常一个方法不处理它产生的异常一个方法不处理它产生的异

28、常, ,而是沿着调用堆栈向上传而是沿着调用堆栈向上传递递, ,由调用它的方法来处理这些异常,则需要声明异常。由调用它的方法来处理这些异常,则需要声明异常。声明异常的方法:声明异常的方法: returnType methodName(paramlist) throws ExceptionList例如:例如: void compute(int x) throws ArithmeticException 例如,某方法readFile()对文件进行读操作,根据前面章节的介绍可以知道:当进行I/O操作时,可能会产生I/O异常。所以,在方法readFile中如果读文件操作不成功,则抛出I/O异常。如下列程

29、序片断所示:readFile() throws IOException if (读文件不成功读文件不成功)throw new IOExcepion();三、异常的抛出examplepublic class ThrowsException1 static void Proc(int sel) throws ArrayIndexOutOfBoundsException System.out.println(-In Situation+sel+-); if(sel=0) System.out.println(no Exception caught); return; else if(sel=1) i

30、nt iArray=new int4; iArray10=3; example public static void main(String args) try Proc(0); Proc(1); catch(ArrayIndexOutOfBoundsException e) System.out.println(Catch +e); finally System.out.println(in Proc finally); 程序运行结果:程序运行结果:- In Situation0 -no Exception caught- In Situation1 -Catch java.lang.Arr

31、ayIndexOutOfBoundsException:10in Proc finally throws子句声明异常如果一个方法可能抛出多个必检异常,那么必须在方法的如果一个方法可能抛出多个必检异常,那么必须在方法的声明部分一一列出,多个异常间使用逗号进行分隔:声明部分一一列出,多个异常间使用逗号进行分隔:Class MyClass public myMethod(String s) throws IOException, MalformedURLException 三、异常的抛出异常的捕获当一个异常被抛出时,应该有专门的语句来接受这个被抛出的异常对象,这个过程称为捕获异常。要捕获一个异常,程

32、序员只需要在程序中设置一个try-catch-finally语句,其格式如下: try 抛出异常的代码 catch (某Exception类型1 e) 处理该异常类型的代码 catch (某Exception类型2 e) 处理该异常类型的代码 . finally 总要执行的代码 .四、异常的捕获与处理v该语句包含try、catch、finally三个子句。catch子句可以有多个,而且至少有一个catch子句或finally子句。异常可在抛出位置捕获并处理,也可由调用者捕获并处理(与Ex8_6比较)class PrimaryAdd public double add(double a,doub

33、le b)throws Exception if(a0|b0) throw new Exception(a0|b0); return a+b; public class Ex8_9 public static void main(String args) PrimaryAdd obj=new PrimaryAdd();trySystem.out.println(2+3=+obj.add(2,3); System.out.println(-2+3=+obj.add(-2,3);catch(Exception e)System.out.println(输入了负数,产生了异常!+e);异常的捕获与处

34、理需要注意的是:如果需要注意的是:如果trytry块中没有任何的异常抛出,块中没有任何的异常抛出,则所有的则所有的catchcatch子句将会被跳过;如果子句将会被跳过;如果trytry块中所抛出块中所抛出的异常对象类型与所有的的异常对象类型与所有的catchcatch子句中的所声明的异子句中的所声明的异常类型都不匹配,则方法会立即中止,并将该异常对常类型都不匹配,则方法会立即中止,并将该异常对象继续抛出,沿调用堆栈传递。象继续抛出,沿调用堆栈传递。异常处理主要用于使程序从故障中恢复,包括提示异常处理主要用于使程序从故障中恢复,包括提示信息、不产生无效结果和释放资源三个方面,前二者信息、不产生

35、无效结果和释放资源三个方面,前二者由由trytry和和catchcatch块实现,释放资源可通过块实现,释放资源可通过finallyfinally块实块实现,保证程序的安全性和健壮性。现,保证程序的安全性和健壮性。 四、异常的捕获与处理4.1 try/catch语句详解try子句是一段可能发生异常的语句:凡是可能抛出异常的语句都放在这里,包括系统自动抛出异常的语句、throw语句和可能抛出异常的方法调用语句。catch子句用来捕获并处理指定的异常。catch子句只需要一个形式参数指明它所能够捕获的异常类型,这个类型必须是Throwable的子类。一个被抛出的异常对象,如果满足下列三个条件中的任

36、何一个时,就会被catch子句捕获。异常对象的类与catch子句参数指定异常类相同。异常对象的类属于catch子句参数指定异常类的子类。异常对象的类与实现了catch子句参数指定接口的类相同。 一个异常被抛出后,try语句处理一般分三种情况:(1)、try子句内的语句没有发生任何异常,如果没有finally子句,那么跳过catch子句,直接执行try语句后面的语句Other Statements。(2)、try子句内的语句发生异常并被catch子句捕获,将异常对象的引用值传递给catch子句捕获,将异常对象的引用值传递给catch子句的参数变量,中断现有的流程,跳转到该catch子句,执行异常

37、处理语句。如果catch子句没有产生新的异常对象,执行完catch子句后,如果没有finally子句,就直接执行try语句后面的Other Statements语句。(3)、try子句内的语句发生异常,但是没有被catch子句捕获。这种情况在没有被捕获的异常小节里专门论述。注意:当发生异常时,如果有catch捕捉到了异常,那么不管具体的异常处理代码是什么(甚至不含任何语句),Java运行系统都认为该异常已经被处理。try子句内的代码可能会发生多种类型的异常。每次执行try语句时,至多只能抛出一个异常。try语句也允许有多个catch子句,每个catch子句可以捕获一种类型的异常。每次执行try

38、语句时,至多只能有一个异常处理代码被执行。存在多个catch子句时,程序执行的流程也分为三种情况:(1)、try子句内的语句没有发生任何异常,如果没有finally子句,那么跳过所有的catch子句,直接执行try语句后面的语句Other Statements。多异常的捕获与处理(2)、如果try子句产生的异常对象被第一个catch块捕获,则程序的流程将直接跳转到这个catch子句块中,该catch子句执行完毕后,如果没有finally子句,就退出整个try语句,执行try语句后面的Other Statements语句。而try子句中尚未执行的语句和其他尚未捕获的catch子句将被忽略;如果t

39、ry子句产生的异常对象不能被第一个catch子句捕获,系统将按catch子句编写次序判断第二个catch子句,如果第二个catch子句不能捕获该异常对象,就转向第三个catch子句进行判断;直到找到一个可以捕获该异常对象的catch子句。如果所有的catch子句都不能捕获该异常对象,那就表明该方法不能捕获这个异常对象,程序流程将返回到调用方法上。(3)、try子句内的语句发生异常,但是所有的方法都不能捕获该异常对象,即没有被任何catch子句捕获。这种情况将在没有被捕获的异常小节里专门论述。因此,catch子句的排列应该是:先特殊后一般或先子类后父类,但只捕获一次。即处理子类型异常的catch

40、子句一定要放在处理超类型异常的catch子句之前,否则,处理子类型异常的处理代码就没机会被执行。注意:(1)、如果将一个处理超类型异常的catch子句放在处理子类型异常的catch子句之前,或者两个catch子句捕获同一类型的异常,编译系统都将给出错误信息。(2)、不同的catch子句是不同的作用域,不能访问其他catch子句定义的局部变量。(3)、在catch子句中不能访问 try 子句中声明的局部变量。4.2多异常的捕获与处理trytry子句内的代码可能会发生多种类型的异常。每次执行子句内的代码可能会发生多种类型的异常。每次执行trytry语句时,至多只能抛出一个异常。语句时,至多只能抛出

41、一个异常。当当trytry块中的某条代码抛出异常时:首先,自该语句的下块中的某条代码抛出异常时:首先,自该语句的下一条语句起的所有一条语句起的所有trytry块中的剩余语句将被跳过不予执行;块中的剩余语句将被跳过不予执行;其次,程序执行其次,程序执行catchcatch子句进行异常捕获,异常捕获的目的子句进行异常捕获,异常捕获的目的是进行异常类型的匹配,并执行与所抛出的异常类型相对是进行异常类型的匹配,并执行与所抛出的异常类型相对应的应的catchcatch子句中的异常处理代码。子句中的异常处理代码。每次执行每次执行trytry语句时,至多只能有一个异常处理代码被执语句时,至多只能有一个异常处

42、理代码被执行。行。四、异常的捕获与处理举例:一个学生在上学过程中可能会受到许多意外情况的干扰而影响正常学习。现编程使用多个catch 子句,模拟上课过程中异常情况的处理。每种意外情况都自定义为异常类。class StudentException extends Exception public String toString() return StudentException:学生问题!如学习态度、方法等需学生自己解决。;class TeacherException extends Exception public String toString() return TeacherExcepti

43、on:教师问题!如教学态度、水平等需教师自己解决。;class TeachingException extends Exception public String toString() return TeachingException:教学计划问题!教学大纲设置等需学院自己解决。;class FacilityException extends Exception public String toString() return FacilityException:教学设施问题!多媒体设备故障等需学校自己解决。;class Student void goToClass() throws Stude

44、ntException,TeacherException,TeachingException,FacilityException int n=(int)(Math.random()*5); System.out.println(n); /try if(n=1) throw new StudentException(); if(n=2) throw new TeacherException(); if(n=3) throw new TeachingException(); if(n=4) throw new FacilityException(); /*catch(StudentExceptio

45、n e) System.out.println(e); catch(TeacherException e) System.out.println(e); catch(TeachingException e) System.out.println(e); catch(FacilityException e) System.out.println(e); */ public class Ex8_10 public static void main(String args) Student obj=new Student(); try obj.goToClass() ; catch(Exceptio

46、n e) System.out.println(e);/*catch(StudentException e) System.out.println(e); catch(TeacherException e) System.out.println(e); catch(TeachingException e) System.out.println(e); catch(FacilityException e) System.out.println(e);*/ System.out.println(末尾);examplepublic class ExampleOfException String li

47、nes = The first line, The second line,The last line; public static void main (String args) ExampleOfException eoe = new ExampleOfException(); eoe.methodA(); System.out.println(Program finished.); . void methodC() for (int i=0; i4; i+) try System.out.println (linesi); catch (ArrayIndexOutOfBoundsExce

48、ption e) System.out.println(Re-setting Index Value); 四、异常的捕获与处理example上面的例子中可能会产生数组越界异常,所以将其置于try块中,并在catch子句中对ArrayIndexOutOfBoundsException类型的异常进行捕获,并进行处理。如果try块中可能抛出多个类型的异常,程序员可以使用多个catch子句对这些异常进行捕获,每种异常类型对应一个单独的catch子句。需要注意的是,这些catch子句是顺序执行的。这意味着,异常对象总是被第一个catch子句首先捕获,如果类型不匹配,才会执行下一个catch子句。四、异常

49、的捕获与处理问题:分析下面的程序片断,看看有什么样的问题存在。JavaJava运行系统从上到下分别对每个运行系统从上到下分别对每个catchcatch语句语句处理的例外类型进行检测处理的例外类型进行检测, ,直到类型匹配为止;直到类型匹配为止;catchcatch语句的排列顺序应该是从子类到父类;语句的排列顺序应该是从子类到父类;try catch(Exception e) catch(IOException e) catch(ArrayIndexOutOfBoundsException e) 四、异常的捕获与处理5.1没有捕获到的异常当try子句方式异常时,如果没有一个catch子句能够捕捉

50、到,则按下列步骤进行处理。(1)、由外层try语句处理:如果try语句本身是另外一个try语句的try子句的一部分,那么异常就由该外层try语句的catch子句捕捉处理。(2)、由调用方法处理:如果没有外层的try语句,或者外层try语句也没有catch子句能够捕捉该异常,则由调用方法处理。(3)、由Java虚拟机执行默认程序:如果所有的方法都不能捕获该异常对象,那么Java虚拟机打印来自方法调用栈的异常信息,如果该线程不是主线程,那么终止这个线程,其他线程继续正常执行。如果该线程是主线程,那么整个应用程序被终止。注意:异常对象总是沿着方法调用栈调用顺序的反方向传递。 五、异常的处理的进一步讨

51、论class StudentException extends Exception public String toString() return StudentException:学生问题!如学习态度、方法等需学生自己解决。;class TeacherException extends Exception public String toString() return TeacherException:教师问题!如教学态度、水平等需教师自己解决。;class TeachingException extends Exception public String toString() return

52、 TeachingException:教学计划问题!教学大纲设置等需学院自己解决。;class FacilityException extends Exception public String toString() return FacilityException:教学设施问题!多媒体设备故障等需学校自己解决。;class Student void goToClass() throws TeachingException,FacilityException int n=(int)(Math.random()*5); try try if(n=1) throw new StudentExcep

53、tion(); if(n=2) throw new TeacherException(); if(n=3) throw new TeachingException(); if(n=4) throw new FacilityException(); catch(StudentException e) System.out.println(e); catch(TeacherException e) System.out.println(e); public class Ex8_18 public static void main(String args) Student obj=new Stude

54、nt(); try obj.goToClass() ; catch(TeachingException e) System.out.println(e); catch(FacilityException e) System.out.println(e);异常没有被捕获并在方法调用栈反方向传递,转由调用方法处理。 5.2 catch子句抛出的异常try子句发生的异常可以由语句中的某个catch子句捕捉处理,但在执行catch子句内的异常处理代码时也可能再抛出新的异常。此时,原先的异常被遗弃,新的异常从try语句抛出并沿着方法调用栈反方向传递。与“没有捕捉到的异常”类似,该新异常或者由外层try语

55、句的catch子句捕捉,或者由方法的调用者处理。在catch子句中抛出异常,一般有两个目的。(1)、异常转译:把捕获的异常转换为新的不同类型的异常,再抛出新异常对象。异常转译使得异常类型与抛出异常对象的对象类型出于不同的抽象层。(2)、异常链:把原始异常包装为新的异常类,或者说在新的异常类中封装了原始异常类。这有助于查找产生异常的根本原因。 五、异常的处理的进一步讨论异常链举例许多意外情况都可能导致不能正常教学。现编程模拟一个学校的一个多媒体设备发生故障,导致不能正常教学,并以统一报告形式向学校汇报,学校根据报告的内容进行相应的处理。class NoTeachingException exte

56、nds Exception Throwable cause; public NoTeachingException(Throwable cause) this.cause=cause; public Throwable getCause() return cause; public String toString() return NoTeachingException:+cause.toString();class FacilityException extends Exception public String toString() return FacilityExceptio:教学设施

57、问题!多媒体设备故障等需学校自己解决。;class Student void go_to_class() throws NoTeachingException try int n=4; if(n=4)throw new FacilityException(); catch(FacilityException e) System.out.println(e); throw new NoTeachingException(e);class University public void run(Student o) tryo.go_to_class(); catch(NoTeachingExcept

58、ion e) System.out.println(e); if(e.getCause() instanceof FacilityException) System.out.println(学校责令有关部门检修多媒体设备。);public class Ex8_19 public static void main(String args) Student obj=new Student(); University object=new University(); object.run(obj); 5.3 构造方法抛出的异常由于构造方法没有返回类型,构造方法体不能使用带表达由于构造方法没有返回类型

59、,构造方法体不能使用带表达式的式的returnreturn语句,也就不能通过返回一个特殊值来表示其语句,也就不能通过返回一个特殊值来表示其执行出现了异常。(普通方法可以)执行出现了异常。(普通方法可以)因此,需要对构造方法抛出的异常进行扑捉和处理,或者因此,需要对构造方法抛出的异常进行扑捉和处理,或者声明抛出异常,由调用方法处理。声明抛出异常,由调用方法处理。五、异常的处理的进一步讨论class TimeException extends Exception private int t,m,s; TimeException(int t,int m,int s) super(时间设置错误!当出现

60、时分秒+t+:+m+:+ s+不在范围内时引发了自定义异常TimeException.); this.t=t; this.m=m; this.s=s; public String toString() return TimeException:时间设置错误!+t+:+m+:+s+ ; class MyTimeprivate int hour; private int minute; private int second; public MyTime(int h,int m,int s)throws TimeException if (h=24|m=60|s=60) throw new Time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论