异常处理课件

上传人:阳*** 文档编号:82362517 上传时间:2022-04-29 格式:PPT 页数:67 大小:212.50KB
收藏 版权申诉 举报 下载
异常处理课件_第1页
第1页 / 共67页
异常处理课件_第2页
第2页 / 共67页
异常处理课件_第3页
第3页 / 共67页
资源描述:

《异常处理课件》由会员分享,可在线阅读,更多相关《异常处理课件(67页珍藏版)》请在装配图网上搜索。

1、1第八章第八章 异常处理异常处理(Exception)8.1 异常分类异常分类8.2 引发异常引发异常8.3 声明抛出异常声明抛出异常8.4 捕捉异常捕捉异常8.5 定义自己的异常类型定义自己的异常类型8.6 构造方法与异常处理构造方法与异常处理8.7 小结小结2 try-catch-finally语句语句 ,其语法格式:其语法格式: try /可能发生异常的代码可能发生异常的代码 catch(异常类型异常类型1 变量)变量) /异常的处理代码异常的处理代码 catch(异常类型异常类型2 变量)变量) /异常的处理代码异常的处理代码 .finally /总是要执行的代码总是要执行的代码 产生

2、异常语句throw抛出异常异常类结构异常的方法finally机制3异常异常(例外例外) 是方法代码是方法代码运行时出现的非正常状态运行时出现的非正常状态,这种,这种非正常状态使程序无法或不能再正常地继续往非正常状态使程序无法或不能再正常地继续往下运行。下运行。常见的异常:常见的异常: 数组下标越界数组下标越界 除数为零除数为零 内存溢出内存溢出 文件找不到等。文件找不到等。 4运行机制:运行机制: 当一个方法在当一个方法在运行时发生异常运行时发生异常时,将时,将产生产生相应类型相应类型的一个的一个异常对象异常对象、中止代码继续往下、中止代码继续往下运行并寻找相应的异常处理代码。运行并寻找相应的

3、异常处理代码。异常处理:异常处理:1 判断异常类型判断异常类型2 产生对象产生对象3 捕获处理异常捕获处理异常5 异常对象记录着这个异常的一些描述和异常对象记录着这个异常的一些描述和状态信息。状态信息。 方法运行失败时,记录这个异常信息的异常方法运行失败时,记录这个异常信息的异常对象将产生(或称为对象将产生(或称为引发引发,抛出抛出,throw),),它有两种引发方式:它有两种引发方式: 1 系统自动引发系统自动引发 2 在程序中由在程序中由throw语句引发语句引发 异常对象引发后,系统根据异常对象的类型,异常对象引发后,系统根据异常对象的类型,首先在当前方法寻找相应的异常处理代码,找首先在

4、当前方法寻找相应的异常处理代码,找到后就将控制流转入该异常处理代码并向其传到后就将控制流转入该异常处理代码并向其传递异常对象(称为递异常对象(称为捕获该异常捕获该异常,catch),),异常异常处理代码可以根据接受到的异常对象进行相应处理代码可以根据接受到的异常对象进行相应的处理;的处理;6寻找相应的异常处理代码的过程:寻找相应的异常处理代码的过程:当前方法当前方法直接或间接调用者直接或间接调用者找到,传递异常对象并进行异常处理找到,传递异常对象并进行异常处理没有找到,调用没有找到,调用默认的异常处理程序,默认的异常处理程序,中止当前线程中止当前线程 7举例(没有异常处理的情况)举例(没有异常

5、处理的情况)1) class ExceptionDivideBy0 2) 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.); 11) 8Exception in thread main java.lang.ArithmeticException: / by zero at ExceptionDivideBy0.method(Ex

6、ceptionDivideBy0.java:4) at ExceptionDivideBy0.main(ExceptionDivideBy0.java:8)Press any key to continue.9具有异常处理的情况具有异常处理的情况class ExceptionDivideBy0 static void method() int x = 0,z=10; try int y = 10 / x; System.out.println(z=+z); catch(ArithmeticException e) System.out.println(ArithmeticException);

7、 System.out.println(After try/catch blocks.); public static void main(String args) method(); System.out.println(After method.); 10ArithmeticExceptionAfter try/catch blocks.After method.11每个异常由类每个异常由类Throwable或者它的一个子类的实例表或者它的一个子类的实例表示,这样的示,这样的对象可被抛出并能被传递给合适的异常对象可被抛出并能被传递给合适的异常处理代码处理处理代码处理。Throwable类及

8、其子类统称为异常类,类及其子类统称为异常类,每个异常类表示一种异常类型。每个异常类表示一种异常类型。Throwable类是类是Object类的直接子类,其本身又有两类的直接子类,其本身又有两个直接子类:个直接子类: Error与与Exception类。类。RuntimeException类是类是Exception类的直接子类,如类的直接子类,如图图8-1所示。这里,所示。这里, Error类、类、RuntimeException类类和和Exception类分别代表某一类异常类型:类分别代表某一类异常类型:8.1 异常分类异常分类12图图8-1 异常类型及其分类异常类型及其分类13(1) Err

9、or类及其子类:类及其子类: 表示灾难性的、普通程序很表示灾难性的、普通程序很难恢复的异常,例如:难恢复的异常,例如: NoClassDefFoundError(类定义没找到异常):(类定义没找到异常): JVM无无法找到相应的法找到相应的class文件。文件。 OutOfMemoryError(内存越界异常):(内存越界异常): JVM没有足够的没有足够的存储空间满足对象创建的要求。存储空间满足对象创建的要求。 NoSuchMethodError(调用不存在的方法异常):(调用不存在的方法异常): 在改在改变某个方法的签名后,原先要调用该方法的应用程序,在运变某个方法的签名后,原先要调用该方

10、法的应用程序,在运行时就会抛出该异常。行时就会抛出该异常。 一般情况下,程序员可不必理会这类异常,它们一般情况下,程序员可不必理会这类异常,它们虽然很严重,但很少发生。虽然很严重,但很少发生。14(2) RuntimeException类及其子类:类及其子类: 表示设计或实现表示设计或实现方面的问题,例如:方面的问题,例如: ArithmeticException(算术运算异常):(算术运算异常): 算术运算时发生算术运算时发生的异常情况,如整数相除,除数为零。的异常情况,如整数相除,除数为零。 ClassCastException(强制类型转换异常):(强制类型转换异常): 把一个对象把一个

11、对象引用转换成一个不合适的类型,如把一个对象引用转换成某引用转换成一个不合适的类型,如把一个对象引用转换成某个子类类型。个子类类型。 NullPointerException(空引用异常):(空引用异常): 需要对象引用时使需要对象引用时使用了一个用了一个null引用。引用。 ArrayIndexOutOfBoundsException(数组下标越界异常):(数组下标越界异常): 下标值超出了数组大小。下标值超出了数组大小。 NumberFormatException(数字格式异常):(数字格式异常): 试图将非数试图将非数字格式字符串转换成数值。字格式字符串转换成数值。15(3) Excep

12、tion类及其非类及其非RuntimeException子类子类: 表表示示运行时因环境的影响而引发的异常运行时因环境的影响而引发的异常,例如:,例如: IOException(输入输出异常):(输入输出异常): 在在I/O操作失败或者被中操作失败或者被中断时引发。其子类包括:断时引发。其子类包括: EOFException、InterruptedIOException等。等。 InterruptedException(中断异常):(中断异常): 当前等待或睡眠线当前等待或睡眠线程被其他线程中断时引发。程被其他线程中断时引发。 这类异常并非因设计或实现引起,是无法避免的。这类异常并非因设计或实

13、现引起,是无法避免的。但一般情况下,但一般情况下,程序员应该提供相应的代码捕捉和程序员应该提供相应的代码捕捉和处理处理。16受检查的异常和不受检查的异常:受检查的异常和不受检查的异常:受检查的异常受检查的异常 Exception类及其非类及其非RuntimeException子类属于受子类属于受检查的异常;检查的异常; 受检查的异常要受编译系统的检查受检查的异常要受编译系统的检查。如果一个方法。如果一个方法可能会引发这类异常而又不能适当处理,那么应该用可能会引发这类异常而又不能适当处理,那么应该用throws子句声明抛出;调用者或者用子句声明抛出;调用者或者用try-catch语句捕语句捕捉处

14、理,或者也用捉处理,或者也用throws子句声明抛出,并由它的调子句声明抛出,并由它的调用者处理。用者处理。 也就是说,也就是说,对方法中可能会抛出的受检查异常,对方法中可能会抛出的受检查异常,程程序员必须捕捉处理或声明抛出,两者必选其一序员必须捕捉处理或声明抛出,两者必选其一,否则,否则编译系统将给出错误信息。编译系统将给出错误信息。17受检查的异常和不受检查的异常:受检查的异常和不受检查的异常:不受检查的异常:不受检查的异常: 类类Error和类和类RuntimeException及其子类属于不受检及其子类属于不受检查的异常,如图查的异常,如图8-1所示。所示。 不受检查的异常不受编译系统

15、的检查。对这类异常,不受检查的异常不受编译系统的检查。对这类异常,程序员可以捕捉或声明抛出,但通常可以不加理会。程序员可以捕捉或声明抛出,但通常可以不加理会。18异常类的方法和属性异常类的方法和属性 (1)异常类的构造方法异常类的构造方法 public Exception() 创建新异常。创建新异常。public Exception(String message) 用字符串参数用字符串参数message描述异常信息创建新异常。描述异常信息创建新异常。 (2)异常类的方法异常类的方法public String toString() 返回描述当前异常对象信息的字返回描述当前异常对象信息的字符串。符

16、串。 public String getMessage() 返回描述当前异常对象的详细返回描述当前异常对象的详细信息。信息。 public void printStackTrace() 在屏幕上输出当前异常对在屏幕上输出当前异常对象使用堆栈的轨迹,即程序中先后调用了哪些方法,象使用堆栈的轨迹,即程序中先后调用了哪些方法,使得运行过程中产生了这个异常对象。使得运行过程中产生了这个异常对象。 19所谓异常的引发是指因程序运行出现异常情况而产所谓异常的引发是指因程序运行出现异常情况而产生异常对象、进而转入异常处理过程的情形。生异常对象、进而转入异常处理过程的情形。Java运行系统在发现异常情况时会自

17、动引发异常。运行系统在发现异常情况时会自动引发异常。自动引发异常自动引发异常 如下例如下例:8.2 引发异常引发异常20【例【例8-1】在发生异常情况时由运行系统引发异常】在发生异常情况时由运行系统引发异常class Demo public static void main(String args) int a = args.length; System.out.println(a = + a); int b = 42 / a; int c= 1 ; c4 = 99; System.out.println(After try/catch blocks.); 21throw引发异常引发异常 异常

18、既可以在发生异常情况时由运行系统引发,异常既可以在发生异常情况时由运行系统引发,也可以在程序中也可以在程序中用用throw语句显式引发语句显式引发。格式如下:格式如下: throw new ArithmeticException();22【例【例8-2】下面程序在被减数】下面程序在被减数a小于减数小于减数b时将引发时将引发ArithmeticException异常异常。1) class Test 2) static int method(int a,int b) 3) if(a b) 4) throw new ArithmeticException(a b); /产生异常产生异常5) retu

19、rn a - b;6) 7) public static void main(String args) 8) method(3, 5);9) 10) 下面是该程序的输出结果:下面是该程序的输出结果: Exception in thread main java.lang.ArithmeticException: a bat Test.method(Test.java:4)at Test.main(Test.java:8)23如果一个方法引发的是受检查的异常且自己没有捕如果一个方法引发的是受检查的异常且自己没有捕捉,那么它必须用捉,那么它必须用throws子句声明抛出;子句声明抛出;该方法的该方法

20、的调用者调用者如果不对异常进行捕捉,那么也必如果不对异常进行捕捉,那么也必须用须用throws子句声明抛出。子句声明抛出。下面是包含下面是包含throws子句的方法定义的语法格式:子句的方法定义的语法格式: () throws .8.3 声明抛出异常声明抛出异常24【例【例8-3】下面程序与例】下面程序与例8-2中的程序基本相同,只是中的程序基本相同,只是method方法可能抛出的是一个受检查的方法可能抛出的是一个受检查的Exception异常,但它既没有异常,但它既没有捕捉也没有声明抛出,所以是不能通过编译的。捕捉也没有声明抛出,所以是不能通过编译的。1) class Test 2) sta

21、tic int method(int a,int b) 3) if(a b) 4) throw new Exception(a b);5) return a - b;6) 7) public static void main(String args) 8) int r = method(3, 5);9) System.out.println(r = + r);10) 11) throws Exception throws Exception 25 对不受检查的异常,同样可以声明抛出(或进行对不受检查的异常,同样可以声明抛出(或进行捕捉),这在语法上是允许的。捕捉),这在语法上是允许的。 无论是

22、受检查的异常还是不受检查的异常,对不无论是受检查的异常还是不受检查的异常,对不受检查的异常,不管是否声明了异常抛出,异常一旦受检查的异常,不管是否声明了异常抛出,异常一旦引发,其处理过程是一致的,即:引发,其处理过程是一致的,即: 异常沿着方法调用异常沿着方法调用的反方向传播,寻找并转入合适的异常处理代码执行。的反方向传播,寻找并转入合适的异常处理代码执行。如果方法及其所有的调用者都没有提供合适的处理代如果方法及其所有的调用者都没有提供合适的处理代码,那么异常将最终传播到运行系统,运行系统调用码,那么异常将最终传播到运行系统,运行系统调用默认的异常处理代码后终止程序执行。图默认的异常处理代码后

23、终止程序执行。图8-2说明了例说明了例8-2和例和例8-3中异常引发和传递的过程。中异常引发和传递的过程。26图图8-2 异常传播过程示意图异常传播过程示意图27回忆超类和子类中方法覆盖的要求:回忆超类和子类中方法覆盖的要求:两个方法具有相同的方法签名(即方法名和方两个方法具有相同的方法签名(即方法名和方法的参数完全一致)法的参数完全一致)返回类型相同返回类型相同覆盖方法的访问级别不能低于被覆盖方法的访覆盖方法的访问级别不能低于被覆盖方法的访问级别问级别覆盖方法覆盖方法(子类方法子类方法)不能比被覆盖方法不能比被覆盖方法(超类方超类方法法)抛出更多类型的受检查异常抛出更多类型的受检查异常。下面

24、通过例子加以说明。下面通过例子加以说明。28【例【例8-4】有以下类定义:】有以下类定义: 1) import java.io.*;2) 3) class TestClass4) void testM(BaseClass o) throws IOException5) o.method(); 7) 8) 9) class BaseClass10) void method() throws IOException11) . 12) 29请问下面哪些请问下面哪些BaseClass类的子类定义类的子类定义是合法的?是合法的?A) class A extends BaseClass void meth

25、od() throws IOException B) class B extends BaseClass void method() throws Exception C) class C extends BaseClass void method() throws EOFException, 30D) class D extends BaseClass void method() throws IOException,InterruptedException E) class E extends BaseClass void method() F) class F extends BaseC

26、lass void method() throws IOException,NullPointerException 31【例2.10】从键盘输入一个整数和实数,并输出它们的和 import java.io.*; / 引入引入java.io包包class InputDemo public static void main(String args) throws IOException / 用标准输入用标准输入System.in创建一个创建一个 BufferedReaderBufferedReader br = new BufferedReader(new InputStreamReader(S

27、ystem.in); System.out.print(请输入一个整数:请输入一个整数:);String str = br.readLine(); / 输入字符行存入字符串输入字符行存入字符串int i = Integer.parseInt(str);/ 转换字符串为整型数据转换字符串为整型数据32 System.out.print(请输入一个实数:请输入一个实数:); str = br.readLine(); float f = Float.parseFloat(str); System.out.print(它们的和是:它们的和是:+(i+f); 33 如果不加以捕捉,引发的异常将沿着方法调

28、用的如果不加以捕捉,引发的异常将沿着方法调用的反方向往外抛出和传播,直至反方向往外抛出和传播,直至Java运行系统。通常,运行系统。通常,这并不是所希望的结果。一般来说,引发异常的方这并不是所希望的结果。一般来说,引发异常的方法的调用者应该捕捉,并根据具体情况处理异常,法的调用者应该捕捉,并根据具体情况处理异常,从而阻止异常继续往外传播。从而阻止异常继续往外传播。Java使用使用try-catch-finally语句来捕捉和处理可能发生的异常,该语句的语句来捕捉和处理可能发生的异常,该语句的语法格式如下:语法格式如下: 8.4 捕捉异常捕捉异常34try / 此处是可能发生异常的代码此处是可能

29、发生异常的代码 catch( ) / 异常的处理代码异常的处理代码 catch( ) / 异常的处理代码异常的处理代码finally / 总是要执行的代码总是要执行的代码该语句包含该语句包含try、catch和和finally三个子句。其中,三个子句。其中,catch子句可以有多个,而且子句可以有多个,而且至少有一个至少有一个catch子句或子句或finally子句子句。35try子句包含一段可能要发生异常的代码。一旦发子句包含一段可能要发生异常的代码。一旦发生异常,将由后面的生异常,将由后面的catch子句捕捉处理。每个子句捕捉处理。每个catch子句有一个参数,参数类型指明该子句能够捕捉的

30、子句有一个参数,参数类型指明该子句能够捕捉的异常类型。如果子句指定的参数类型是所发生的异异常类型。如果子句指定的参数类型是所发生的异常的类或者是其超类,则说明常的类或者是其超类,则说明catch子句能够捕捉该子句能够捕捉该异常。此时,运行系统将把异常对象的引用值传递异常。此时,运行系统将把异常对象的引用值传递给给catch子句的参数变量,并将控制流转移到该子句的参数变量,并将控制流转移到该catch子句,执行子句内的异常处理代码。之后,接着执子句,执行子句内的异常处理代码。之后,接着执行行try语句后面的代码。语句后面的代码。如果如果try子句内的代码没有发生任何异常,那么跳子句内的代码没有发

31、生任何异常,那么跳过过catch子句,直接执行子句,直接执行try语句后面的代码。语句后面的代码。8.4.1 try和和catch子句子句36class Demo public static void main(String args) try int a = args.length; System.out.println(a = + a); int b = 42 / a; int c= 1 ; c4 = 99; catch(ArithmeticException e) / 捕获算术运算异常捕获算术运算异常 System.out.println(Divide by 0: + e); catch

32、(ArrayIndexOutOfBoundsException e) System.out.println(Array index oob: + e); System.out.println(After try/catch blocks.); 【例【例8-5】try和和catch子句举例子句举例37a = 0Divide by 0: java.lang.ArithmeticException: / by zeroAfter try/catch blocks.38最后说明两点最后说明两点: (1) 当发生异常时,如果有当发生异常时,如果有catch捕捉到了异常,那么捕捉到了异常,那么不管具体的异

33、常处理代码如何(不管具体的异常处理代码如何(甚至不含任何语甚至不含任何语句句),),Java运行系统都认为该异常已被消除;运行系统都认为该异常已被消除;(2) 当执行完异常处理代码后,控制流并不会回到异当执行完异常处理代码后,控制流并不会回到异常发生处,而是执行常发生处,而是执行try语句后面的代码(如果没有语句后面的代码(如果没有finally子句)。子句)。39 try子句内的代码可能会发生子句内的代码可能会发生多种类型的异常多种类型的异常,而,而try语句也允许有语句也允许有多个多个catch子句子句,每个,每个catch子句可以子句可以捕捉一种类型(包括子类型)的异常。捕捉一种类型(包

34、括子类型)的异常。 当然,每次执行当然,每次执行try语句时,至多只能抛出一个异语句时,至多只能抛出一个异常,相应地,至多只能有一个异常处理代码被执行。常,相应地,至多只能有一个异常处理代码被执行。 8.4.2 多个多个catch子句子句40 当异常发生时,运行系统将按先后次序依次判断当异常发生时,运行系统将按先后次序依次判断各各catch子句,如果发现某个子句,如果发现某个catch子句能够捕捉该异子句能够捕捉该异常,就执行其中的处理代码,而其后面的常,就执行其中的处理代码,而其后面的catch子句子句将被忽略。将被忽略。 注意:注意:处理子类型异常的处理子类型异常的catch子句一定要放在

35、处子句一定要放在处理超类型异常的理超类型异常的catch子句之前子句之前。 如果将一个处理超类型异常的如果将一个处理超类型异常的catch子句放在处理子句放在处理子类型异常的子类型异常的catch子句之前,或者两个子句之前,或者两个catch子句捕子句捕捉同一类型的异常,编译系统都将给出错误信息。捉同一类型的异常,编译系统都将给出错误信息。41public class Test2 public static void main (String args) int x=0; int y; try y=100/x; catch (Exception ex) ex.printStackTrace()

36、; catch (ArithmeticException ex) ex.printStackTrace(); (ArithmeticException ex)(Exception ex)Test2.java:9: 已捕捉到异常 java.lang.ArithmeticException catch (ArithmeticException ex) 1 错误编译不通过:42使用使用finally子句的好处是:子句的好处是: 控制流不管以何种原因离开控制流不管以何种原因离开try语句,都要先执行语句,都要先执行finally子句。子句。 所以,所以,可以将那些无论是否发生异常、异常无论是可以将那些

37、无论是否发生异常、异常无论是否被捕捉都需要执行的代码放置在否被捕捉都需要执行的代码放置在finally子句内。子句内。8.4.3 finally子句子句43控制流离开控制流离开try语句的情况可分为以下几种:语句的情况可分为以下几种: try子句代码正常执行,没有引发异常;子句代码正常执行,没有引发异常; try子句代码执行时引发异常,但被子句代码执行时引发异常,但被catch子句捕捉子句捕捉处理;处理; try子句代码执行时引发异常,但没有子句代码执行时引发异常,但没有catch子句能子句能捕捉处理;捕捉处理; try子句代码执行时引发异常,且被子句代码执行时引发异常,且被catch子句捕捉

38、,子句捕捉,但在执行异常处理代码时发生新的异常。但在执行异常处理代码时发生新的异常。注意:因注意:因return、break或或continue等跳转语句(不管等跳转语句(不管是出现在是出现在try子句中,还是出现在子句中,还是出现在catch子句中)要离开子句中)要离开try语句时,同样需要先执行语句时,同样需要先执行finally子句。子句。441) class FinallyDemo 2) static void m1(int i) 3) try 4) if(i = 2) 5) System.out.println(第第2种情况:种情况: 发生算术运算异常发生算术运算异常);6) thr

39、ow new ArithmeticException();7) if(i = 3) 8) System.out.println(第第3种情况:种情况: 发生数字格式异常发生数字格式异常);9) throw new NumberFormatException();10) if(i = 4) 11) System.out.println(第第4种情况:种情况: 发生数组下标越界异常发生数组下标越界异常);12) throw new ArrayIndexOutOfBoundsException();13) 14) System.out.println(第第1种情况:种情况: 没有发生异常没有发生异常

40、);15) 【例【例8-9】finally子句举例子句举例4515) catch(ArithmeticException e)16) System.out.println(异常被捕捉处理异常被捕捉处理); 17) catch(ArrayIndexOutOfBoundsException e)18) System.out.println(异常被捕捉,但又被重新引发异常被捕捉,但又被重新引发);19) throw e; 20) finally21) System.out.println(这是这是finally子句子句); 23) System.out.println(这是这是try语句后的代码语句

41、后的代码);24) 25) public static void main(String args)26) for(int i = 1; i java Testcaught java.lang.ArrayIndexOutOfBoundsException: 0 in mainexiting from main如果命令行的第如果命令行的第1个参数为非数字格式字符串,下面是程序的输个参数为非数字格式字符串,下面是程序的输出结果:出结果: C:java Test aaacaught java.lang.NumberFormatException: aaa in m1exiting from m1ex

42、iting from main如果命令行的第一个参数为数字如果命令行的第一个参数为数字0,下面是程序的输出结果:,下面是程序的输出结果:C: java Test 0caught java.lang.ArithmeticException: / by zero in mainexiting from main51try子句发生的异常可以由语句中的某个子句发生的异常可以由语句中的某个catch子句捕子句捕捉处理,但在执行捉处理,但在执行catch子句内的异常处理代码时也子句内的异常处理代码时也可能再引发新的异常。此时,原先的异常被遗弃,可能再引发新的异常。此时,原先的异常被遗弃,新的异常从新的异常

43、从try语句抛出并向外传播。与语句抛出并向外传播。与未捕捉到的未捕捉到的异常异常类似,该新异常或者由外层类似,该新异常或者由外层try语句的语句的catch子子句捕捉,或者由方法的调用者处理。句捕捉,或者由方法的调用者处理。8.4.5 再引发异常再引发异常521) import java.io.IOException; /【例【例8-8】再引发异常举例】再引发异常举例2) class Test 3) static void m1() throws IOException 4) try5) throw new RuntimeException(demo_1); 6) catch(RuntimeE

44、xception e)7) System.out.println(caught + e + in m1); 8) throw new IOException(demo_2); 9) 10) public static void main(String args) 11) try12) m1(); 13) catch(IOException e)14) System.out.println(caught + e + in main); 15) System.out.println(exiting from main);16) 17)53下面是程序的输出结果:下面是程序的输出结果: caught

45、java.lang.RuntimeException: demo_1 in m1caught java.io.IOException: demo_2 in mainexiting from main54 8.5 定义自己的异常类型定义自己的异常类型 自定义的异常类型必须是自定义的异常类型必须是Throwable类的子类。只类的子类。只有有Throwable类及其子类的实例才能够被引发和捕捉。类及其子类的实例才能够被引发和捕捉。通常将自定义异常类型定义成通常将自定义异常类型定义成Exception的子类,以的子类,以产生受检查的异常。产生受检查的异常。 Java异常处理机制的特点是方法的调用者必

46、须认异常处理机制的特点是方法的调用者必须认识和处理方法可能会抛出的受检查异常,而对不受识和处理方法可能会抛出的受检查异常,而对不受检查的异常,调用者则可以不加理会。检查的异常,调用者则可以不加理会。55例:在定义银行类时,若取钱数大于余额则作为异常处理(InsufficientFundsException)。思路:思路:n 产生异常的条件是余额少于取额,因此是否抛出异常要先判断该条件。n 确定产生异常的方法,应该在取钱方法withdrawal中产生异常InsufficientFundsException 。n 处理异常安排在调用withdrawal的时候,因此withdrawal方法要声明异常

47、,由上级方法捕获并处理。n 要定义好自己的异异常。56public class InsufficientFundsException extends Exception private Bank excepbank; private double excepAmount; InsufficientFundsException(Bank ba, double dAmount) excepbank = ba; excepAmount = dAmount; public String toString() String str = The balance + excepbank.getbalance

48、() + The withdrawal was+excepAmount; return str; 57class Bank double balance; /余额余额 public void deposite(double dAmount) /存钱存钱 if(dAmount0.0) balance = balance + dAmount; public void withdrawal(double dAmount) throws InsufficientFundsException /取钱取钱 if( balancedAmout ) throw new InsufficientFundsExc

49、eption(this, dAmount); balance = balance-dAmount; public double getbalance() /获取余额获取余额 return balance; 58public class ExceptionDemo public static void main(String args) try Bank ba = new Bank(); ba.deposite(50); ba.withdrawal(100); System.out.println(Withdrawal successful!); catch(Exception e) Syste

50、m.out.println(e.toString(); 59【例】设计自己的异常。从键盘输入一个【例】设计自己的异常。从键盘输入一个doubledouble类类型的数,若不小于型的数,若不小于0.00.0,则输出它的平方根,若小于,则输出它的平方根,若小于0.00.0,则输出提示信息,则输出提示信息 输入错误!输入错误! 。 import java.io.*;class MyException extends Exception double x; MyException(double x) this.x=x; public String toString() return 输入错误输入错误:

51、x0.0+ x=+x; 60public class MySqrt static void test(double x) throws MyException if(x 0.0) throw new MyException(x); else System.out.println(Math.sqrt(x); public static void main(String args) throws IOException try System.out.print(求输入实数的平方根求输入实数的平方根,请输入一个实数请输入一个实数:); BufferedReader br = new Buffered

52、Reader(new InputStreamReader(System.in); String s = br.readLine(); test(Double.parseDouble(s); catch(MyExceptionClass e) System.out.println(e.toString(); 61 与普通方法一样,构造方法也可以引发异常、捕与普通方法一样,构造方法也可以引发异常、捕捉异常或者声明抛出异常。实际上,构造方法有时捉异常或者声明抛出异常。实际上,构造方法有时比普通方法更需要使用异常处理机制。对于普通方比普通方法更需要使用异常处理机制。对于普通方法,有时可以通过返回一个特

53、殊值来表示其执行出法,有时可以通过返回一个特殊值来表示其执行出现了异常。例如,一个方法的返回类型是一种引用现了异常。例如,一个方法的返回类型是一种引用类型,且在正常情况下它总是能返回一个对象的引类型,且在正常情况下它总是能返回一个对象的引用,那么就可以返回一个用,那么就可以返回一个null值表示非正常情况,而值表示非正常情况,而不是抛出异常。这种处理方式不适用于构造方法。不是抛出异常。这种处理方式不适用于构造方法。构造方法没有返回类型,构造方法体不能使用带表构造方法没有返回类型,构造方法体不能使用带表达式的达式的return语句。下面是构造方法引发和抛出异常语句。下面是构造方法引发和抛出异常的

54、一个例子:的一个例子: 8.6 构造方法与异常处理构造方法与异常处理621) class TimeException extends Exception 2) private int t,m,s;3) TimeException(int t, int m, int s) 4) this.t = t;5) this.m = m;6) this.s = s;7) 8) public String toString() 9) return Exception + t + , + m + , + s + ;10) 11) 12) 13) public class MyTime 14) private

55、int hour; /02315) private int minute; /05916) private int second; /0596318) public MyTime(int h,int m,int s) throws TimeException 19) if(h =24 | m = 60 | s = 60) 20) throw new TimeException(h,m,s);21) 22) hour = h;23) minute = m;24) second = s; 25) 26) 27) 当用当用new运算符调用构造方法创建类的实例时,如果构造方法运算符调用构造方法创建类的

56、实例时,如果构造方法抛出异常而突然结束,那么对象的引用值不会被返回。例如:抛出异常而突然结束,那么对象的引用值不会被返回。例如:MyTime t;t = new MyTime(11,69,10);64(1) 异常是方法代码运行时出现的非正常状态,这异常是方法代码运行时出现的非正常状态,这种非正常状态使程序无法或不能再正常地继续往下种非正常状态使程序无法或不能再正常地继续往下运行。运行。(2) Java采用面向对象的方法来处理异常。每当采用面向对象的方法来处理异常。每当发生异常事件时,就会引发一个异常对象。运行系发生异常事件时,就会引发一个异常对象。运行系统根据异常对象的类型寻找相应的代码处理异

57、常。统根据异常对象的类型寻找相应的代码处理异常。异常对象的类型是异常对象的类型是Throwable类或其子类。类或其子类。(3) Java编译系统将异常分为受检查的异常编译系统将异常分为受检查的异常(unchecked Exceptions)和不受检查的异常)和不受检查的异常(checked Exceptions)两大类。)两大类。8.7 小结小结65(4) 异常引发方式:由运行系统引发,由异常引发方式:由运行系统引发,由throw语语句显式地引发。句显式地引发。(5) 异常引发时,代码将不再继续往下执行,而异常引发时,代码将不再继续往下执行,而由系统寻找合适的异常处理代码执行。当不能寻找由系

58、统寻找合适的异常处理代码执行。当不能寻找到合适的异常处理代码时,将调用默认异常处理程到合适的异常处理代码时,将调用默认异常处理程序,并终止当前线程。序,并终止当前线程。(6) 对不受检查的异常,对不受检查的异常,Java程序员通常可以不程序员通常可以不加处理;而对受检查的异常,方法代码要么捕捉处加处理;而对受检查的异常,方法代码要么捕捉处理、要么通过理、要么通过throws子句声明抛出。子句声明抛出。(7) 如果一个子类方法覆盖了一个超类方法,那如果一个子类方法覆盖了一个超类方法,那么列在子类方法的么列在子类方法的throws子句(如果有的话)中的异子句(如果有的话)中的异常数目不能多于超类方

59、法中声明的。常数目不能多于超类方法中声明的。66(8) try语句由语句由try、catch和和finally 3种子句组成:种子句组成: 至少有一个至少有一个try子句,可以有多个子句,可以有多个catch子句,而且至子句,而且至少有一个少有一个catch子句或子句或finally子句。子句。(9) try子句包含可能会抛出异常的代码;子句包含可能会抛出异常的代码;catch子子句捕捉句捕捉try子句代码可能抛出的异常;子句代码可能抛出的异常;finally子句包子句包含那些无论是否发生异常、异常无论是否被捕捉都含那些无论是否发生异常、异常无论是否被捕捉都需要执行的代码。需要执行的代码。(10) Java程序员可以根据需要定义自己的异常类程序员可以根据需要定义自己的异常类型。自定义的异常类型一般被定义成受检查的异常型。自定义的异常类型一般被定义成受检查的异常类型。类型。67下课! Thank you!

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!