Ja15-08第9章异常处理_第1页
Ja15-08第9章异常处理_第2页
Ja15-08第9章异常处理_第3页
Ja15-08第9章异常处理_第4页
Ja15-08第9章异常处理_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

1、L/O/G/O第第9章章 异常处理异常处理1本章主要内容本章主要内容自定义异常类的设计自定义异常类的设计4异常的定义与分类异常的定义与分类1try-catch-finally语句语句2抛出异常的方式抛出异常的方式32v异常异常(exceptionexception) :在程序运行中由代码产生的一在程序运行中由代码产生的一种错误种错误。v在不支持异常处理的程序设计语言中,每一个运行在不支持异常处理的程序设计语言中,每一个运行错误必须由程序员手动控制错误必须由程序员手动控制( (例如例如C C语言语言) )。vJavaJava语言:异常处理机制,将程序运行时的管理带语言:异常处理机制,将程序运行时

2、的管理带到面向对象的世界。到面向对象的世界。3v 按照错误的性质按照错误的性质分类:分类:语法错:语法错:是由于违反是由于违反JavaJava的语法规则而产生的错误,的语法规则而产生的错误,只要没只要没有编译错误,才可生成字节码。有编译错误,才可生成字节码。语义错语义错(运行错)(运行错):程序在语法上正确,但在语义上存在程序在语法上正确,但在语义上存在错误,如输入数据格式错、除数为错误,如输入数据格式错、除数为0 0错、给变量赋值超出其错、给变量赋值超出其允许范围等允许范围等,这类错误只能在运行时发现,有的还需进行,这类错误只能在运行时发现,有的还需进行异常处理。异常处理。逻辑错:逻辑错:程

3、序编译通过,也可运行,但运行结果与预期不程序编译通过,也可运行,但运行结果与预期不符。如由于循环条件不正确而没有结果,循环次数不对等符。如由于循环条件不正确而没有结果,循环次数不对等因素导致的计算结果不正确等。因素导致的计算结果不正确等。 只有凭借经验排查。只有凭借经验排查。4v 根据错误严重程度的不同根据错误严重程度的不同将将运行错运行错分类:分类:错误:错误:是指程序在执行过程中所遇到的硬件或操作系统的错是指程序在执行过程中所遇到的硬件或操作系统的错误误,是致命的,需外界干预,是致命的,需外界干预。如:内存溢出、虚拟机错等。如:内存溢出、虚拟机错等。异常:异常:是指在硬件和操作系统正常时,

4、程序遇到的运行错。是指在硬件和操作系统正常时,程序遇到的运行错。如数组越界、除数为如数组越界、除数为0 0、操作数超出数据范围等、异常不是致、操作数超出数据范围等、异常不是致命的,但会导致程序非正常终止,异常处理机制使程序自身命的,但会导致程序非正常终止,异常处理机制使程序自身能够捕获和处理异常。能够捕获和处理异常。5v 异常异常(类)(类):是指程序在运行过程中发生由于算法考虑不周或软:是指程序在运行过程中发生由于算法考虑不周或软件设计错误等导致的程序异常事件件设计错误等导致的程序异常事件。v 抛出异常:在一个程序运行过程中,如果发生了异常事件,则产抛出异常:在一个程序运行过程中,如果发生了

5、异常事件,则产生一个代表该异常的生一个代表该异常的对象对象,并把它提交给运行系统的过程称为抛,并把它提交给运行系统的过程称为抛出出(throw)(throw)异常。异常。v 捕获异常:异常抛出后,运行系统从生成异常对象的代码开始,捕获异常:异常抛出后,运行系统从生成异常对象的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应异常处理的方沿方法的调用栈逐层回溯查找,直到找到包含相应异常处理的方法,并把异常对象提交给该方法为止,这个过程称为捕获法,并把异常对象提交给该方法为止,这个过程称为捕获(catch)(catch)异常。异常。6异常对象可由应用程异常对象可由应用程序本身产生,也可能序本身

6、产生,也可能由由JVM产生产生7Method1Method2Method3Read-filecallcallcalltry-catch 捕获异常捕获异常抛出异常抛出异常 throwsthrowsthrows捕获异常捕获异常 可以放置在上可以放置在上述任何一个矩形之中。述任何一个矩形之中。v JavaJava中定义了很多异常类,每个异常类代表一种运行错误,类中定义了很多异常类,每个异常类代表一种运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当中包含了该运行错误的信息和处理错误的方法等内容。每当JavaJava程序运行过程中产生一个可识别的运行错误时,系统都会程序运行过程中产生一个

7、可识别的运行错误时,系统都会产生一个相应的该异常类的对象。产生一个相应的该异常类的对象。JavaJava采取采取“抛出抛出- -捕获捕获”的的方式,一旦一个异常对象产生了,系统就可以捕获这些异常,方式,一旦一个异常对象产生了,系统就可以捕获这些异常,并且有相应的机制来处理它,确保不会产生死机、死循环或其并且有相应的机制来处理它,确保不会产生死机、死循环或其他损害,从而保证了整个程序运行的安全性。这就是他损害,从而保证了整个程序运行的安全性。这就是JavaJava的异的异常处理机制。常处理机制。89 一个异常是由一个对象来代表的,所有的异常都一个异常是由一个对象来代表的,所有的异常都直接或间接地

8、继承自直接或间接地继承自ThrowableThrowable类。类。 在在JavaJava类库的每个类包中都定义了异常类,这些类库的每个类包中都定义了异常类,这些异常类分成两大类:异常类分成两大类:ErrorError类及类及ExceptionException类,后者是类,后者是JavaJava程序中需要大量处理的。程序中需要大量处理的。 除了除了JavaJava类库所定义的异常类之外,用户也可以类库所定义的异常类之外,用户也可以通过继承已有的异常类来定义自己的异常类,并在通过继承已有的异常类来定义自己的异常类,并在程序中使用(利用程序中使用(利用throwthrow产生,产生,throws

9、throws声明抛出,声明抛出,catchcatch捕捉并处理)。捕捉并处理)。10 在在“异常异常”类层次上的最上层有一个单独的类叫做类层次上的最上层有一个单独的类叫做ThrowableThrowable,它是它是java.langjava.lang包中的一个类。包中的一个类。 java.lang.Errorjava.lang.Error:由由JavaJava虚拟机生成并抛出,包括动态链接失败、虚拟机虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,错误等,JavaJava程序不做处理程序不做处理,必须交由操作系统处理,必须交由操作系统处理。 java.lang.Exceptionjava.

10、lang.Exception:供应用程序使用的,它是用户程序能够捕捉到的供应用程序使用的,它是用户程序能够捕捉到的异常情况。异常情况。JavaJava编译器要求编译器要求JavaJava程序必须捕获或声明所有的程序必须捕获或声明所有的非运行时异常非运行时异常。 Runtime ExceptionRuntime Exception:JavaJava虚拟机在虚拟机在运行时生成的异常运行时生成的异常,如被,如被0 0除等系统除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。由系统检测运行效率影响太

11、大。由系统检测, , 用户可不做处理,系统将它们交给缺省用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。的异常处理程序(当然,必要时,用户可对其处理)。1111 异常类的层次结构异常类的层次结构 ( (参看图参看图9.1)9.1)ThrowableErrorExceptionExceptionRuntimeException缺省的异常缺省的异常处理程序处理程序由用户捕获或由用户捕获或声明并处理声明并处理不做处理不做处理用户自己产生的异常用户自己产生的异常处理处理12一些常用的异常类一些常用的异常类nError (all in java.lang)nLinkag

12、eErrornThreadDeathnVirtualMachineErrornInternalErrornOutOfMemoryErrornStackOverflowErrornUnknownErrornAWTError (in java.awt)n13nException (in java.lang)nClassNotFoundExceptionnCloneNotSupportedExceptionnInterruptedExceptionnnRuntimeExceptionnArithmeticExceptionnClassCastExceptionnInllegalArgumentExc

13、eptionnInllegalThreadStateExceptionnNumberFormatExceptionnExceptionnIOException (in java.io)nCharConversionExceptionnEOFExceptionnFileNotFoundExceptionnInterruptedIOExceptionn14nRuntimeExceptionnInllegalMonitorStateExceptionnInllegalStateExceptionnIndexOutOfBoundsExceptionnArrayIndexOutObBoundsExcep

14、tionnStringIndexOutObBoundsExceptionnNegativeArraySizeExceptionnNullPointerExceptionnSecurityExceptionnnEmptyStackException (in java.util)nMissingResourceException (in java.util)nNoSuchElementException (in java.util)nv ExceptionException构造方法:构造方法:public Exceptionpublic Exception();();public Exceptio

15、npublic Exception(String sString s); ;v Exception Exception常用方法:常用方法:public String toString()public String toString():该方法返回描述当前:该方法返回描述当前ExceptionException类信息类信息的字符串。的字符串。public void printStackTrace()public void printStackTrace():该方法没有返回值,它的功能:该方法没有返回值,它的功能是完成一个输出操作,在当前的标准输出设备(一般是屏幕是完成一个输出操作,在当前的标准输

16、出设备(一般是屏幕显示器)上输出当前异常对象的堆栈使用轨迹,即程序先后显示器)上输出当前异常对象的堆栈使用轨迹,即程序先后调用并执行了哪些对象或类的哪些方法,使得运行过程中产调用并执行了哪些对象或类的哪些方法,使得运行过程中产生了这个异常对象。生了这个异常对象。通常是对该异常所通常是对该异常所对应的错误描述。对应的错误描述。15v程序对错误与异常的处理方式有三种:程序对错误与异常的处理方式有三种:一是程序不能处理的错误一是程序不能处理的错误,交操作系统处理,交操作系统处理;二是程序应避免而可以不去捕获的运行时异二是程序应避免而可以不去捕获的运行时异常常(RuntimeExceptionRunt

17、imeException);三是必须捕获三是必须捕获(使用(使用try-catch-finaltry-catch-final)的非运的非运行时异常。行时异常。16v异常类异常类异常处理是通过异常处理是通过trytry、catchcatch、finallyfinally、throwthrow、throwsthrows五个关键字来实现的。五个关键字来实现的。v使用使用try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常捕获异常的意义:能让程序来接收和处理异常对捕获异常的意义:能让程序来接收和处理异常对象,从而不影响其他语句的执行。象,从而不影响其

18、他语句的执行。17v使用使用try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常捕获异常:当一个异常被抛出时,有专门的语句捕获异常:当一个异常被抛出时,有专门的语句来接收这个被抛出的异常对象。当一个异常类的来接收这个被抛出的异常对象。当一个异常类的对象被捕获或接收后,用户程序就会发生流程跳对象被捕获或接收后,用户程序就会发生流程跳转,系统终止当前的流转而跳转到专门的异常处转,系统终止当前的流转而跳转到专门的异常处理语句块,或直接跳出当前程序和理语句块,或直接跳出当前程序和JVMJVM回到操作回到操作系统。系统。18try-catch-fina

19、llytry-catch-finally语句语法格式:语句语法格式:try 要检查的语句序列要检查的语句序列 ; /可能产生异常的语句可能产生异常的语句catch (异常类名异常类名 形参对象名形参对象名) 异常发生时的处理语句异常发生时的处理语句; /捕获到某种异常对象时捕获到某种异常对象时 /进行处理的代码进行处理的代码finally 异常发生时一定会运行的语句异常发生时一定会运行的语句19v try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常的顺序:的顺序:trytry块中代码抛出异常,若发生异常,则程序的运行便中断,块中代码抛出异常

20、,若发生异常,则程序的运行便中断,并抛出由并抛出由“异常类异常类”所产生的所产生的“对象对象”。同时,该代码块。同时,该代码块也指定了它后面的也指定了它后面的catchcatch语句所捕获的异常的范围,每个语句所捕获的异常的范围,每个catchcatch块都应该与一个块都应该与一个trytry语句块相对应,这个语句块相对应,这个trytry语句块用语句块用来启动来启动JavaJava的异常处理机制。的异常处理机制。catchcatch用来指定需要捕获的异常类型用来指定需要捕获的异常类型,捕获到捕获到异常异常,然后流,然后流程自动跳过产生异常的语句后面的所有尚未执行的语句,程自动跳过产生异常的语

21、句后面的所有尚未执行的语句,系统就直接跳到系统就直接跳到catchcatch语句中,查看是否有匹配的异常类语句中,查看是否有匹配的异常类,若有就执行相应语句。若有就执行相应语句。20v try-catch-finallytry-catch-finally语句捕获和处理异常语句捕获和处理异常的顺序:的顺序:无论无论trytry程序块是否捕获到异常,或者捕获到的异常是否程序块是否捕获到异常,或者捕获到的异常是否与与catchcatch后面括号里的异常相同,最后一定会运行后面括号里的异常相同,最后一定会运行finallyfinally块块里的程序代码;里的程序代码;finallyfinally块的代

22、码运行结束后,程序再转到块的代码运行结束后,程序再转到try-catch-finallytry-catch-finally块之后的语句继续运行。块之后的语句继续运行。( finallyfinally块块)若若trytry块中所有的语句都没有引发异常,则所有的块中所有的语句都没有引发异常,则所有的catchcatch块块都会被忽略而不执行。(都会被忽略而不执行。( catchcatch块一定会被执行吗?块一定会被执行吗?)2122import java.util.Scanner;public class Divide1 public static int divide( int a1, int

23、a2 ) return a1 / a2; / a2可能为0 public static void main( String args ) Scanner scanner = new Scanner( System.in ); System.out.print( Please enter an integer numerator: ); int one = scanner.nextInt(); System.out.print( Please enter an integer denominator: ); int two = scanner.nextInt(); int result = di

24、vide( one, two ); System.out.printf(nResult: %d / %d = %dn, one,two, result ); /这个例子会产生错误,但是没有处理机制,所以运行不稳定。一个例子23import java.util.*;public class DivideOk public static int divide( int a1, int a2) throws ArithmeticException return a1 / a2; public static void main( String args ) Scanner scanner = new

25、Scanner( System.in ); boolean continueLoop = true; do try catch ( InputMismatchException inputMismatchException ) catch ( ArithmeticException arithmeticException ) while ( continueLoop ); /增加捕获异常语句,能够处理 除数为零( a2为0 )的程序增加异常捕获语句24 do try System.out.print( “请输入被除数请输入被除数: ); int one = scanner.nextInt();

26、 System.out.print( “请输入除数请输入除数: ); int two = scanner.nextInt(); int result = divide( one, two ); System.out.printf( nResult: %d / %d = %dn, one, two, result ); continueLoop = false; / input successful; end looping catch ( InputMismatchException inputMismatchException ) System.err.printf( nException:

27、 %sn, inputMismatchException ); scanner.nextLine(); / discard input so user can try again System.out.println( “必须输入整数,请重新输入:必须输入整数,请重新输入:.n ); catch ( ArithmeticException arithmeticException ) System.err.printf( nException: %sn, arithmeticException ); System.out.println( “除数为除数为0,请重新输入,请重新输入.n ); wh

28、ile ( continueLoop ); catchcatchv 多异常处理多异常处理通过一个通过一个trytry块后面定义若干块后面定义若干catchcatch块来实现的,每个块来实现的,每个catchcatch块块用来接收和处理一种特定的异常对象。用来接收和处理一种特定的异常对象。若若trytry块产生的异常对象被第一个块产生的异常对象被第一个catchcatch块所接收,则程序的块所接收,则程序的流程将直接跳转到这个流程将直接跳转到这个catchcatch语句块中,语句块中,trytry块中尚未执行的块中尚未执行的语句和其他的语句和其他的catchcatch块将被忽略。块将被忽略。若若

29、trytry块产生的异常对象与块产生的异常对象与第一个第一个catchcatch块不匹配,系统将自动转到第二个块不匹配,系统将自动转到第二个catchcatch块进行块进行匹配匹配,依次类推,直到找到一个可以接收该异常对象的依次类推,直到找到一个可以接收该异常对象的catchcatch块,即完成流程的跳转。块,即完成流程的跳转。2526n异常总是由距离产生异常最近的匹配异常总是由距离产生异常最近的匹配catch代码段处理代码段处理n如果没有相应的异常处理,如果没有相应的异常处理,n则异常被交给上一层则异常被交给上一层try代码段进行处理代码段进行处理n异常处理的查找依据类型匹配原则顺序进行异常

30、处理的查找依据类型匹配原则顺序进行n第一个匹配的异常处理被执行,当异常处理执行完毕,程序第一个匹配的异常处理被执行,当异常处理执行完毕,程序接着最后一个接着最后一个catch代码段后的语句执行代码段后的语句执行n异常处理的顺序影响到异常的处理异常处理的顺序影响到异常的处理n子类异常可被父类异常处理捕获子类异常可被父类异常处理捕获n不要先捕获父类异常,再捕获子类异常不要先捕获父类异常,再捕获子类异常n如果找不到相应的异常处理如果找不到相应的异常处理n非非GUI程序将结束程序执行;程序将结束程序执行;nApplet或或GUI程序则回复到事件处理状态程序则回复到事件处理状态n catch(Excep

31、tion e)n 捕获所有Exceptionn catch(Throwable t)n 捕获Exception和Errorcatch语句块语句块 (1)27n尽量避免用一般类型作为尽量避免用一般类型作为catch中指定要捕获的类型。中指定要捕获的类型。n一般应该按照一般应该按照try代码块中异常可能产生的顺序及其真正类型代码块中异常可能产生的顺序及其真正类型进行捕获和处理,进行捕获和处理,n在异常处理中无法访问在异常处理中无法访问try代码段中声明的变量代码段中声明的变量n因为此时因为此时try代码段已经退出了,异常处理所需要的任何信息代码段已经退出了,异常处理所需要的任何信息一般都应该通过异

32、常对象来传递一般都应该通过异常对象来传递n在使用方法时尽量直接处理该方法可能产生的异常在使用方法时尽量直接处理该方法可能产生的异常n这样你的程序就会更健壮这样你的程序就会更健壮n在使用库方法之前,应该先仔细阅读说明文档在使用库方法之前,应该先仔细阅读说明文档n那里会介绍方法可能产生的异常以及异常产生的条件那里会介绍方法可能产生的异常以及异常产生的条件n在使用各种异常类之前也应该先仔细阅读说明文档在使用各种异常类之前也应该先仔细阅读说明文档n那里会介绍异常的具体含义及异常产生的条件那里会介绍异常的具体含义及异常产生的条件catch语句块语句块 (2)28n在在catch代码段中产生的异常不是由相

33、同代码段中产生的异常不是由相同try的后续的后续catch代码段处理,而是由包含整个代码段处理,而是由包含整个try-catch结构的上层结构的上层try代代码段检测并处理码段检测并处理n可以把可以把catch到的异常对象到的异常对象再次抛出再次抛出,使上层,使上层try-catch结结构继续处理该异常事件;也可以把异常对象转换为其它构继续处理该异常事件;也可以把异常对象转换为其它异常对象异常对象ncatch (Exception e) throw e; ntry-catch机制不该被用于流程控制,异常情形应该是很机制不该被用于流程控制,异常情形应该是很稀少的,而不是经常性的稀少的,而不是经常

34、性的n在在catch代码段中的代码段中的return语句用于退出方法,而不是返语句用于退出方法,而不是返回到异常抛出点(回到异常抛出点(throw point)catch语句块语句块 (3)29public 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(IOExcep

35、tion e) catch(FileNotFoundException e) /永远不会被执行永远不会被执行30 声明异常首先必须生成异常。前面所提到的异常或者是声明异常首先必须生成异常。前面所提到的异常或者是由由Java虚拟机生成,或者是由虚拟机生成,或者是由Java类库中的某些类生成。类库中的某些类生成。事实上,我们在程序中也可以生成自己的异常对象,也即事实上,我们在程序中也可以生成自己的异常对象,也即是异常可以是异常可以不是出错产生,而是人为地抛出不是出错产生,而是人为地抛出。 不论那种方式,生成异常对象都是通过throw语句实现:n throw new ThrowableObject(

36、);n ArithmeticException e = new ArithmeticException(); throw e; 注意:抛出的异常必须是Throwable或其子类的实例。31 抛出异常抛出异常使用使用throwthrow语句抛出的异常对象的语法格式为:语句抛出的异常对象的语法格式为:在一个方法内使用在一个方法内使用throwthrow抛出异常对象,若该方法内部没有用抛出异常对象,若该方法内部没有用try-catchtry-catch对这个抛出的异常进行处理,则此方法应声明抛出对这个抛出的异常进行处理,则此方法应声明抛出异常,由其调用着处理。异常,由其调用着处理。异常抛出点后的代码

37、在抛出异常后不再执行,也可以说异常异常抛出点后的代码在抛出异常后不再执行,也可以说异常的抛出终止了代码段的执行。的抛出终止了代码段的执行。任何从任何从ThrowableThrowable派生的类都可以用派生的类都可以用throwthrow语句抛出,抛出异语句抛出,抛出异常用来表明程序遇到的错误无法正常执行而需要异常处理常用来表明程序遇到的错误无法正常执行而需要异常处理throw 由异常类所产生的对象;由异常类所产生的对象;32class JavaThrowpublic static void main(String args) try throw new ArithmeticException

38、();catch(ArithmeticException ae) System.out.println(ae);try throw new ArrayIndexOutOfBoundsException();catch(ArrayIndexOutOfBoundsException ai) System.out.println(ai);try throw new StringIndexOutOfBoundsException();catch(StringIndexOutOfBoundsException si) System.out.println(si);33import java.util.S

39、canner;public class Dance1 public static void main(String args) Scanner keyboard = new Scanner(System.in); System.out.println(Enter number of male dancers:); int men = keyboard.nextInt(); System.out.println(Enter number of female dancers: ); int women = keyboard.nextInt(); if (men = 0 & women = 0) S

40、ystem.out.println(没有一个学员.); System.exit(0); else if (men = 0) System.out.println(没有男学员.); System.exit(0); else if (women = 0) System.out.println(没有女学员.); System.exit(0); System.out.println(有学员,可以开课.); 没没有有使使用用异异常常 的的 例例子子34import java.util.Scanner;public class Dance2 public static void main(String a

41、rgs) Scanner keyboard = new Scanner(System.in); System.out.println(Enter number of male dancers:); int men = keyboard.nextInt(); System.out.println(Enter number of female dancers:); int women = keyboard.nextInt(); try if (men = 0 & women = 0) throw new Exception(没有一个学员.); else if (men = 0) throw new

42、 Exception(没有男学员.); else if (women = 0) throw new Exception(没有女学员.); catch(Exception e) System.out.println(e.getMessage(); System.exit(0); System.out.println(有学员,可以开课.); 改改造造成成使使用用异异常常的的例例子子35 如果在一个方法中生成了异常,但是该方法并不处理它产生的异常,而是沿着调用层次向上传递,交由调用它的方法来处理这些异常,这就是声明异常声明异常。 通常的情况是在该方法中并不确切知道改如何对这些异常进行处理,比如Fil

43、eNotFoundException类异常,它由FileInputStream的构造方法产生,但在其构造方法中并不清楚如何处理它,是终止程序的执行还是新生成一个文件,这需要由调用它的方法来处理。36 声明异常的方法声明异常的方法 声明异常的方法是在产生异常的方法名后面加上要抛出(throws)的异常的列表: retType methodName(paramlist) retType methodName(paramlist) throws exceptionListthrows exceptionList例如类FileInputStream中的read()方法是这样定义的:public int

44、 read() throws IOException public int read() throws IOException throws子句中可以同时指明多个异常,说明该方法将不对这些异常进行处理,而是声明抛弃它们。 需要强调的是:对于非运行时异常,程序中必须要作处理,对于非运行时异常,程序中必须要作处理,或者捕获,或者声明抛弃;而对于运行时异常,程序中则可不或者捕获,或者声明抛弃;而对于运行时异常,程序中则可不处理。处理。修饰符修饰符 返回值类型返回值类型 方法名方法名(参数列表参数列表) throws 异常类列表异常类列表v 没有处理异常时,没有处理异常时,throwsthrows语句

45、可以保证编译通过语句可以保证编译通过如果在一个程序中的异常没有用如果在一个程序中的异常没有用try-catchtry-catch语句捕获异常和处语句捕获异常和处理异常的代码,则可以在程序代码所在的方法声明的后面用理异常的代码,则可以在程序代码所在的方法声明的后面用throwsthrows关键字声明该方法要抛出异常,将该异常抛出到该方关键字声明该方法要抛出异常,将该异常抛出到该方法的调用方法中,一直可追溯到法的调用方法中,一直可追溯到main()main()方法,方法,JVMJVM肯定要处肯定要处理的,这样编译就可以通过了。在方法声明中添加理的,这样编译就可以通过了。在方法声明中添加throws

46、throws子子句表示方法将抛出异常。句表示方法将抛出异常。教材教材 例例9.537v 由方法抛出异常交系统处理由方法抛出异常交系统处理由一由一对于程序需要处理的异常,一般编写对于程序需要处理的异常,一般编写try-catch-finallytry-catch-finally语句捕获并处理,而对于程序中无法处理必须交由系统语句捕获并处理,而对于程序中无法处理必须交由系统处理的异常,由于系统直接调用的是主方法处理的异常,由于系统直接调用的是主方法main()main(),所以,所以可以在主方法中使用可以在主方法中使用throwsthrows子句声明抛出异常交由系统处子句声明抛出异常交由系统处理,

47、编译能通过,运行也没问题。理,编译能通过,运行也没问题。教材教材 例例9.63839public method1() int x; try x = System.in.read(); compute(x); catch(IOException ioe) System.out.println(“read error”); catch(ArithmeticException e) System.out.println(“devided by 0”); public int compute(int x) throws ArithmeticException int z = 100/x; return

48、 z;method1compute异常异常异常异常抛出抛出处理处理调用调用40捕获异常捕获异常 - finally- finally语句语句 finally语句 捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。 无论无论try所指定的程序块中是否抛出异常,也无论所指定的程序块中是否抛出异常,也无论catch语句的异常类语句的异常类型是否与所抛弃的异常的类型一致,型是否与所抛弃的异常的类型一致,finally所指定的代码都要被执行,所指定的代码都要被执行,它提供了统一的出口。它提供了统一的出口。(fina

49、lly语句与语句与switch中的中的default语句是不同语句是不同的!)的!) 通常在finally语句中可以进行资源的清除工作,如关闭打开的文件、删除临时文件等。41try in = new FileInputStream(“file1.txt”); 对文件进行处理的程序对文件进行处理的程序;catch(IOException e) /对文件异常进行处理对文件异常进行处理;finally /不论是否发生异常,都关闭文件不论是否发生异常,都关闭文件;finally在文件处理时非常有用在文件处理时非常有用n 异常的覆盖n finally代码段中应该把可能产生异常的语句用try-catch保护起来if (in != null) try in.close(); catch (IOExceptio

温馨提示

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

评论

0/150

提交评论