1、T1npublic class t1 npublic static void main(String args)nint arr=35,0,5,7,9,-5;nfor(int k=0;karr.length;k=k+2)nSystem.out.println(arrk);nnT1 answern35n5n9T2npublic class t2 npublic static void main(String args)nint arr=35,0,5,6,7,9,-1,-2,-3;nfor(int k=0;karr.length;k+)nfor(int j=0;jarrk.length;j+)nS
2、ystem.out.println(arrk);nnT2 answernI7d772enI7d772enI7d772enI11b86e7nI11b86e7nI11b86e7nI35ce36nI35ce36nI35ce36npublic class T3 nstatic public void swap(int arr,int pos1,int pos2)nnint tmp=arrpos1;narrpos1=arrpos2;narrpos2=tmp;nnstatic void dispaly(int arr)nnfor(int i=0;iarr.length;i+)nSystem.out.pri
3、nt(arri+t);nSystem.out.println();nnpublic static void main(String args)nint a=1,2,3,4,5;nT3.dispaly(a);nT3.swap(a,1,2);nT3.dispaly(a);nnn1 2 3 4 5n1 3 2 4 5教学目的要求n1.1.理解异常概念,理解理解异常概念,理解Java Java 中抛弃异常中抛弃异常和声明抛弃异常的区别与联系;和声明抛弃异常的区别与联系;n2.2.掌握掌握JavaJava的异常处理机制,学会如何的异常处理机制,学会如何合理应用异常处理机制;合理应用异常处理机制;n3.3
4、.会使用捕获异常和声明抛弃异常的两会使用捕获异常和声明抛弃异常的两种异常处理的方法。种异常处理的方法。第第4讲讲 异常(异常(Exception)处理)处理1 异常的概念异常的概念2 异常处理异常处理3 自定义异常处理类自定义异常处理类4 应用举例应用举例本章内容1.异常的概念异常的概念 Java中将运行错误分为两类:错误和异常。中将运行错误分为两类:错误和异常。致命性错误致命性错误:如程序进入死循环,或递归无法结:如程序进入死循环,或递归无法结束,或内存溢出,这类现象称为错误。错误只能在编束,或内存溢出,这类现象称为错误。错误只能在编程阶段解决,只能依靠其他程序干预,否则会一直处程阶段解决,
5、只能依靠其他程序干预,否则会一直处于非正常状态。于非正常状态。非致命性的异常非致命性的异常:如运算时除数为:如运算时除数为0,或操作数,或操作数超出范围,或打开一个文件时发现文件并不存在,或超出范围,或打开一个文件时发现文件并不存在,或欲装入的类文件丢失,或网络连接中断等,这类现象欲装入的类文件丢失,或网络连接中断等,这类现象称为异常。称为异常。n 没有错误处理的程序没有错误处理的程序:openTheFile;openTheFile;determine its size;determine its size;allocate that much memory;allocate that muc
6、h memory;read-file read-file closeTheFile;closeTheFile;1 异常的概念异常的概念1 异常的概念异常的概念 在在C/C+语言中,通过使用语言中,通过使用if语句来判断是否出现了错语句来判断是否出现了错误,误,同时,调用函数通过被调用函数的返回值感知在被调用同时,调用函数通过被调用函数的返回值感知在被调用函数中产生的错误事件并进行处理。但是,这种错误处理机函数中产生的错误事件并进行处理。但是,这种错误处理机制会导致不少问题,因为在很多情况下需要知道错误产生的制会导致不少问题,因为在很多情况下需要知道错误产生的内部细节。内部细节。通常,用某个全局
7、变量来存储一个异常事件的类型通常,用某个全局变量来存储一个异常事件的类型,这容,这容易导致误用,因为该全局变量的值有可能在被处理前被另外易导致误用,因为该全局变量的值有可能在被处理前被另外的错误覆盖掉。此外,即使最优美的的错误覆盖掉。此外,即使最优美的C语言程序,为了处理语言程序,为了处理异常情况,也常常求助于异常情况,也常常求助于goto语句。语句。1 异常的概念异常的概念n 以常规方法处理错误:以常规方法处理错误:openFiles;if(theFilesOpen)determine the length of the file;if(gotTheFileLength)allocate t
8、hat much memory;if(gotEnoughMemory)read the file into memory;if(readFailed)errorCode=-1;else errorCode=-2;else errorCode=-3;else errorCode=-4;else errorCode=-5;用常规方法处理错误存在的主要问题有:用常规方法处理错误存在的主要问题有:n部分精力花在错误处理上;部分精力花在错误处理上;n只处理能够想到的错误,对未知的情况无法只处理能够想到的错误,对未知的情况无法处理;处理;n程序可读性差,大量的错误处理代码混杂在程序可读性差,大量的错误处理
9、代码混杂在程序中;程序中;n出错返回信息量太少,无法更确切地了解错出错返回信息量太少,无法更确切地了解错误状况或原因。误状况或原因。1 异常的概念异常的概念1 异常的概念异常的概念 Java通过面向对象的方法来处理程序中的非严重错误,通过面向对象的方法来处理程序中的非严重错误,在在Java中,中,非严重非严重错误被称为异常(错误被称为异常(Exception)。)。在一个方法的运行过程中,如果发生了异常,则这个方在一个方法的运行过程中,如果发生了异常,则这个方法(或者是法(或者是Java虚拟机)生成一个代表该异常的对象(包含虚拟机)生成一个代表该异常的对象(包含了该异常的详细信息),并把它交给
10、运行时系统,运行时系了该异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛弃把它提交给运行时系统的过程称为抛弃(throw)一个异常。一个异常。运行时系统在方法的调用栈中查找,从生成异常的方法运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回朔,直到找到包含相应异常处理的方法为止,这开始进行回朔,直到找到包含相应异常处理的方法为止,这一个过程称为捕获一个过程称为捕获(catch)一个异常。一个异常。1 异常的概念异常的概念n 用异常的形式处理错误:用异常
11、的形式处理错误:trytry openTheFile;openTheFile;determine its size;determine its size;allocate that much memory;allocate that much memory;read-File;read-File;closeTheFile closeTheFile;catchcatch(fileopenFailed)(fileopenFailed)dosomething;dosomething;catchcatch(sizeDetermineFailed)(sizeDetermineFailed)dosomet
12、hing;dosomething;catchcatch(memoryAllocateFailed)(memoryAllocateFailed)dosomething;dosomething;catchcatch(readFailed)(readFailed)dosomething;dosomething;catchcatch(fileCloseFailed)(fileCloseFailed)dosomething;dosomething;finallyfinally dosomething;dosomething;2 异常处理异常处理 6.2.1 Java中的中的Throwable类类 Jav
13、aJava中的所有异常都是由中的所有异常都是由ThrowableThrowable类的子类生成的对象,类的子类生成的对象,所有的异常类都是所有的异常类都是ThrowableThrowable类的子类或子类的子类。下图给类的子类或子类的子类。下图给出了部分出了部分JavaJava中部分错误类、异常类的继承关系。中部分错误类、异常类的继承关系。ThrowableErrorExceptionAWTErrorLinkageErrorVirtualMachineErrorRuntimeExceptionArithmeticExceptionIndexOutOfBoundsExceptionIndexOu
14、tOfBoundsExceptionAWTExceptionIOExceptionFileNotFoundExceptionEOFExceptionn根据程序对错误与异常的处理方式,可以将根据程序对错误与异常的处理方式,可以将JavaJava中的异常分为中的异常分为两类:两类:nError:是一些严重的程序不能处理的系统错误类是一些严重的程序不能处理的系统错误类,包括,包括内存内存溢出、溢出、动态链接失败、虚拟机错误等动态链接失败、虚拟机错误等,Java程序不做处理。程序不做处理。n Exception:一般程序中可预知的问题,其产生的异常可能会一般程序中可预知的问题,其产生的异常可能会带来意
15、想不到的结果带来意想不到的结果,因此,因此Java编译器要求编译器要求Java程序必须捕获程序必须捕获或声明所有的非运行时异常。或声明所有的非运行时异常。2 异常处理异常处理2 异常处理异常处理ThrowableErrorExceptionExceptionRuntimeException缺省的异常缺省的异常处理程序处理程序由用户捕获或由用户捕获或声明并处理声明并处理不做处理不做处理用户自己产生的异常用户自己产生的异常处理处理2 异常处理异常处理一些常用的异常类一些常用的异常类nError(all in java.lang)nLinkageErrornThreadDeathnVirtualMa
16、chineErrornInternalErrornOutOfMemoryErrornStackOverflowErrornUnknownErrornAWTError(in java.awt)nnException(in java.lang)nClassNotFoundExceptionnCloneNotSupportedExceptionnInterruptedExceptionnnRuntimeExceptionnArithmeticExceptionnClassCastExceptionnInllegalArgumentExceptionnInllegalThreadStateExcept
17、ionnNumberFormatException2 异常处理异常处理一些常用的异常类一些常用的异常类nRuntimeExceptionnInllegalMonitorStateExceptionnInllegalStateExceptionnIndexOutOfBoundsExceptionnArrayIndexOutObBoundsExceptionnStringIndexOutObBoundsExceptionnNegativeArraySizeExceptionnNullPointerExceptionnSecurityExceptionnnEmptyStackException(in
18、 java.util)nMissingResourceException(in java.util)nNoSuchElementException(in java.util)n2 异常处理异常处理一些常用的异常类一些常用的异常类nExceptionnIOException(in java.io)nCharConversionExceptionnEOFExceptionnFileNotFoundExceptionnInterruptedIOExceptionnStreamCorruptedExceptionnJ.MalformedURLExceptionn2 异常处理异常处理一些常用的异常类一些
19、常用的异常类n 异常示例:异常示例:(1)编译时异常:在程序中必须对其进行处理,)编译时异常:在程序中必须对其进行处理,否则编译器会指出错误。否则编译器会指出错误。在使用能够产生异常的方法而没有捕获和处理,程序在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译。将不能通过编译。(2)运行时异常:程序中可以不做处理,直接由)运行时异常:程序中可以不做处理,直接由运行时系统来处理。运行时系统来处理。2 异常处理异常处理try-catch-finally语句语句 Java的异常处理是通过的异常处理是通过3个关键词来实现的:个关键词来实现的:try-catch-finally。用。用try来
20、监视执行一段程序,如果来监视执行一段程序,如果出现异常,系统就会抛出(出现异常,系统就会抛出(throws)异常,可以通)异常,可以通过异常的类型来捕捉(过异常的类型来捕捉(catch)并处理它,或最后)并处理它,或最后(finally)由缺省处理方法来处理。)由缺省处理方法来处理。2 异常处理异常处理-捕获异常捕获异常ntry代码段包含可能产生异常的代码代码段包含可能产生异常的代码ntry代码段后跟有一个或多个代码段后跟有一个或多个catch代代码段码段n每个每个catch代码段声明其能处理的一种代码段声明其能处理的一种特定类型的异常特定类型的异常n每个每个catch代码段都是一段异常处理代
21、代码段都是一段异常处理代码码n程序继续执行最后一个程序继续执行最后一个catch代码段后代码段后的代码的代码(或执行完或执行完finally代码段后代码段后)n不同的代码段是不同的作用域,不可不同的代码段是不同的作用域,不可访问相互之间定义的局部变量访问相互之间定义的局部变量trytry /接受监视的程序块接受监视的程序块,在此区域内发生在此区域内发生 /的异常的异常,由由catchcatch中指定的程序处理中指定的程序处理;/不能有其它语句分隔catchcatch(要处理的异常种类和标识符要处理的异常种类和标识符)/处理异常处理异常;catchcatch(要处理的异常种类和标识符要处理的异常
22、种类和标识符)/处理异常处理异常;finallyfinally /最终处理(缺省处理)最终处理(缺省处理);/Other Statements/Other Statements2 异常处理异常处理-捕获异常捕获异常2 异常处理异常处理-捕获异常捕获异常 try语句语句 捕获异常的第一步就是用捕获异常的第一步就是用try 语句指定了语句指定了一段代码,该段代码就是一次捕获并处理异常的范一段代码,该段代码就是一次捕获并处理异常的范围。在执行过程中,该段代码可能会产生并抛弃一围。在执行过程中,该段代码可能会产生并抛弃一个或多个异常,因此,它后面的个或多个异常,因此,它后面的catch语句进行捕获语句
23、进行捕获时也要做相应的处理。时也要做相应的处理。如果没有异常产生,所有的如果没有异常产生,所有的catch代码段都被代码段都被略过不执行。略过不执行。2 异常处理异常处理-捕获异常捕获异常 catch语句语句 每个每个try语句必须伴随一个或多个语句必须伴随一个或多个catch语句,用于捕获语句,用于捕获try代码块所产生的异常并做相应的处理。代码块所产生的异常并做相应的处理。catch语句有一个语句有一个形式参数,用于指明其所能捕获得异常类型,运行时系统通形式参数,用于指明其所能捕获得异常类型,运行时系统通过参数值把被抛弃的异常对象传递给过参数值把被抛弃的异常对象传递给catch语句。语句。
24、程序设计中要根据具体的情况来选择程序设计中要根据具体的情况来选择catch语句的异常语句的异常处理类型,一般应该按照处理类型,一般应该按照try代码块中异常可能产生的顺序代码块中异常可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为作为catch语句中指定要捕获的类型。语句中指定要捕获的类型。当然也可以用一个当然也可以用一个catch语句处理多个异常类型,这时语句处理多个异常类型,这时它的异常类型应该是这多个异常类型的它的异常类型应该是这多个异常类型的父类父类,但这种方式使,但这种方式使得在程序中不能确切判断异常的具体类型
25、。得在程序中不能确切判断异常的具体类型。npublic class L4_02 n public static void main(String args)n int a,b,c;n a=9;n b=0;n c=a/b;n System.out.println(a+/+b+=+c);nnn没有捕获异常n运行结果nException in thread main java.lang.ArithmeticException:/by zeronat 异常处理.L4_02.main(L4_02.java:7)/处理被除数为处理被除数为0产生的异常举例,产生的异常举例,Li4_01.javapublic
26、 class Li4_01 public static void main(String args)int a,b,c;trya=9;b=0;c=a/b;System.out.println(a+/+b+=+c);catch(ArithmeticException e)System.out.println(出现被出现被0除的异常情况除的异常情况);System.out.println(java程序运行结束程序运行结束!);n运行结果n出现被0除的异常情况njava程序运行结束!2 异常处理异常处理-捕获异常捕获异常 finally语句语句 捕获异常的最后一步是通过捕获异常的最后一步是通过fin
27、ally语句为异常处理提供语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。能够对程序的状态作统一的管理。无论无论try所指定的程序块中是否抛出异常,也无论所指定的程序块中是否抛出异常,也无论catch语语句的异常类型是否与所抛弃的异常的类型一致,句的异常类型是否与所抛弃的异常的类型一致,finally所指所指定的代码都要被执行,它提供了统一的出口。定的代码都要被执行,它提供了统一的出口。通常在通常在finally语句中可以进行资源的清除工作,如关闭语句中可以进行资源的清除工作,如关闭打开
28、的文件、删除临时文件等。打开的文件、删除临时文件等。try in=new FileInputStream(“file1.txt”);对文件进行处理的程序对文件进行处理的程序;catch(IOException e)/对文件异常进行处理对文件异常进行处理;finally /不论是否发生异常,都关闭文件不论是否发生异常,都关闭文件;finally在文件处理时非常有用在文件处理时非常有用n 异常的覆盖异常的覆盖n finally代码段中应该把可能产生代码段中应该把可能产生异常的语句用异常的语句用try-catch保护起来保护起来if(in!=null)try in.close();catch(IOE
29、xception e)/用用try-catch结构,防止结构,防止finally代码段抛出异常代码段抛出异常throw和和throws语句语句 如果在一个方法中生成了异常,但是该方法并不处理它如果在一个方法中生成了异常,但是该方法并不处理它产生的异常,而是沿着调用层次向上传递,交由调用它的方产生的异常,而是沿着调用层次向上传递,交由调用它的方法来处理这些异常,这就是法来处理这些异常,这就是声明异常声明异常。2 异常处理异常处理public void method1()n int x;n tryn System.out.print(Input x:);n Scanner sc=new Scann
30、er(System.in);n x=sc.nextInt();n int z=compute(x);n System.out.println(z=+z);n catch(ArithmeticException e)n System.out.println(devided by 0);n npublic int compute(int x)throws ArithmeticException int z=100/x;return z;method1compute异常异常异常异常抛出抛出处理处理调用调用n非运行时异常非运行时异常nThrowable、Exceptionn运行时异常运行时异常nErr
31、or、RuntimeExceptionn当在一个方法的代码中抛出一个受当在一个方法的代码中抛出一个受检查的异常时,这个异常或者被方检查的异常时,这个异常或者被方法中的法中的try-catch结构捕获,或者在结构捕获,或者在方法的方法的throws语句中声明语句中声明n编译器检查程序,保证所有非运行编译器检查程序,保证所有非运行时异常都被程序显式地处理时异常都被程序显式地处理ThrowableErrorExceptionExceptionRuntimeException2 异常处理异常处理2 异常处理异常处理 声明异常首先必须生成异常。前面所提到的异常或者是由声明异常首先必须生成异常。前面所提到
32、的异常或者是由Java虚拟机生成,或者是由虚拟机生成,或者是由Java类库中的某些类生成。事实类库中的某些类生成。事实上,我们在程序中也可以生成自己的异常对象,也即是异常可上,我们在程序中也可以生成自己的异常对象,也即是异常可以以不是出错产生,而是人为地抛出不是出错产生,而是人为地抛出。不论那种方式,生成异常对象都是通过不论那种方式,生成异常对象都是通过throw语句实现:语句实现:n throw new ThrowableObject();n ArithmeticException e=new ArithmeticException();throw e;注意:抛出的异常必须是注意:抛出的异常
33、必须是Throwable或其子类的实例。或其子类的实例。n任何从任何从Throwable派生的类都可以用派生的类都可以用throw语句抛出,抛出语句抛出,抛出异常用来表明程序遇到的错误无法正常执行而需要异常处理异常用来表明程序遇到的错误无法正常执行而需要异常处理nthrow new MyException(“some infomation”);n异常可以由异常可以由try代码段中的语句抛出代码段中的语句抛出n也可以从被也可以从被try代码段中调用的方法中抛出代码段中调用的方法中抛出n异常还可能产生于数组下标越界以及异常还可能产生于数组下标越界以及Java虚拟机内部错误等虚拟机内部错误等nExc
34、eption和和Error是是Throwable的直接派生类的直接派生类nException,程序应该处理的异常,程序应该处理的异常nError代表系统严重错误,一般程序不处理这类错误代表系统严重错误,一般程序不处理这类错误n异常抛出点后的代码在抛出异常后不再执行异常抛出点后的代码在抛出异常后不再执行n也可以说异常的抛出终止了代码段的执行也可以说异常的抛出终止了代码段的执行2 异常处理异常处理3 自定义异常处理类自定义异常处理类 当我们在设计自己的类包时,应尽最大的努力为用户提当我们在设计自己的类包时,应尽最大的努力为用户提供最好的服务,并且希望用户不要滥用我们所提供的方法,供最好的服务,并且
35、希望用户不要滥用我们所提供的方法,当程序出现某些异常事件时,我们希望程序足够健壮以从程当程序出现某些异常事件时,我们希望程序足够健壮以从程序中恢复,这时就需要用到异常。在选择异常类型时,可以序中恢复,这时就需要用到异常。在选择异常类型时,可以使用使用Java类库中已经定义好的类,也可以自己定义异常类。类库中已经定义好的类,也可以自己定义异常类。自定义异常类不是由自定义异常类不是由Java系统监测到的异常(如数组下标越系统监测到的异常(如数组下标越界,被界,被0除等),而是由用户自己定义的异常。除等),而是由用户自己定义的异常。自定义异常同样要用自定义异常同样要用try-catch-finall
36、y捕获,但必须由用捕获,但必须由用户自己抛出(户自己抛出(throw)。)。异常是一个类,自定义异常必须继承自异常是一个类,自定义异常必须继承自Throwable或或Exception类。建议:类。建议:异常一定是不经常发生的故障,应避免把控制流程作为异常处理。异常一定是不经常发生的故障,应避免把控制流程作为异常处理。尽量使用尽量使用JDK提供的异常类:重用、便于理解。提供的异常类:重用、便于理解。用用Exception/RuntimeException类:编译时异常、运行时异常。类:编译时异常、运行时异常。一般不把自定义异常作为一般不把自定义异常作为Error的子类,因为的子类,因为Erro
37、r通常被用来表示系统内通常被用来表示系统内部的严重故障。部的严重故障。ThrowableErrorExceptionExceptionRuntimeException自定义异常自定义异常处理处理3 自定义异常处理类自定义异常处理类 当自定义异常是从当自定义异常是从RuntimeException及其子及其子类继承而来时,该自定义异常是运行时异常,程类继承而来时,该自定义异常是运行时异常,程序中可以不捕获并处理它。序中可以不捕获并处理它。当自定义异常是从当自定义异常是从Throwable、Exception及及其其他子类继承而来时,该自定义异常是编译时其其他子类继承而来时,该自定义异常是编译时异
38、常,也即程序中必须捕获并处理它。异常,也即程序中必须捕获并处理它。自定义异常的形式自定义异常的形式:class MyException extends Exception 3 自定义异常处理类自定义异常处理类 例例1:计算两个数之和,当任意一个数超出范围:计算两个数之和,当任意一个数超出范围(本例为本例为1020)时,抛出自己的异常。时,抛出自己的异常。public class NumberRangeException extends Exception public NumberRangeException(String msg)super(msg);npublic class AddTwo
39、Number npublic static int CalcAnswer(String str1,String str2)throws NumberRangeExceptionnn int int1,int2;n int answer=-1;n tryn n int1=Integer.parseInt(str1);n int2=Integer.parseInt(str2);n if(int1 20)|(int2 20)n n NumberRangeException e=new NumberRangeExceptionn (Numbers not within the specified ra
40、nge.);n throw e;n n answer=int1+int2;n catch(NumberFormatException e)n System.out.println(e.toString();n n return answer;n/end of CalcAnswer()npublic static void main(String args)nString answerStr;n tryn n int answer=CalcAnswer(12,“9);n n answerStr=String.valueOf(answer);n catch(NumberRangeException
41、 e)n answerStr=e.getMessage();n n System.out.println(answerStr);n/end of main()n/end of classnNumbers not within the specified range.4 应用举例应用举例 npublic class DivByZero n int x;n int y;n DivByZero(int a,int b)n x=a;n y=b;n/end of DivByZero()npublic void test()throws DivideByZeroException n if(y=0)n t
42、hrow new DivideByZeroException();n else n System.out.println(x/y);n npublic static void main(String args)n DivByZero my=new DivByZero(5,0);/对对5除以除以0测试测试 n tryn my.test();n catch(DivideByZeroException e)n System.out.println(Divide By Zero.零作除数。零作除数。);n n /end of main()n/end of classnpublic class Divi
43、deByZeroException extends Exceptionn public DivideByZeroException()n System.out.println(Call DivideByZeroException();n n/end of class例例 2 2 使 用 自 定 义使 用 自 定 义DivideByZeroExceptionDivideByZeroException类,继承类,继承ExceptionException类,类,用于处理被用于处理被0 0除的异常。除的异常。当异常出现时当异常出现时,强制程序强制程序员处理它员处理它。n程序源代码如下:程序源代码如下:
44、nCall DivideByZeroException()nDivide By Zero.零作除数。本章小结本章小结n 异常处理的一般格式:异常处理的一般格式:Java的异常处理机制使得处理异的异常处理机制使得处理异常的代码和常的代码和“常规常规”代码分开,减少了代码的数量,增强代码分开,减少了代码的数量,增强了程序的可读性了程序的可读性(可以对比用可以对比用if语句来处理异常的情形,这语句来处理异常的情形,这时需要进行一系列条件的判定时需要进行一系列条件的判定)。try Java statement;catche(ExceptionType1 ExceptionObject1)Excepti
45、onObject1 handling;catche(ExceptionType2 ExceptionObject2)ExceptionObject2 handling;finally final handling;/统一的出口统一的出口,最终必定要执行最终必定要执行n Java的异常处理机制使得异常事件可以沿调用的异常处理机制使得异常事件可以沿调用堆堆栈自动栈自动向上传播,向上传播,沿着被调用的顺序往前寻找,只要找到符合该沿着被调用的顺序往前寻找,只要找到符合该异常种类的异常处理程序,就交给这部分程序去处理。异常种类的异常处理程序,就交给这部分程序去处理。本章小结本章小结Method1Meth
46、od2Method3Read-filecallcallcalltry-catch产生异常产生异常 throwsthrowsthrows本章小结本章小结 Java通过面向对象的方法进行异常处理,把各种不同的异常事件进行分类,体现了良好的层次性,提供了良好的接口,这种机制对于具有动态运行特性的复杂程序提供了强有力的控制。由于把异常事件当成对象来处理,利用类的层次性可以把多个具有相同父类的异常统一处理,也可以区分不同的异常分别处理,使用非常灵活。当然,从另一方面来看,在捕获或声明异常时,要选取合适类型的异常类,注意异常的类层次,根据不同的情况使用一般或特殊的异常类。n 应该根据具体的情况选择在何处处理异常。或者在方法内捕获并处理,或者用throws子句把它交给调用栈中上层的方法去处理。