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

下载本文档

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

文档简介

1、第第5章章 异常处理异常处理5.1 异常的概念异常的概念5.2 异常的类型异常的类型5.3 异常处理异常处理5.4 创建自定义异常创建自定义异常5.1 异常的概念异常的概念l异常(异常(Exception)指的是程序运行中出现非)指的是程序运行中出现非正常情况。在程序运行过程中,任何中断正正常情况。在程序运行过程中,任何中断正常程序流程的情况都是错误或异常。如:常程序流程的情况都是错误或异常。如: 想打开的文件不存在; 网络连接中断; 操作数超出预定范围;(如除数为0) 数组元素下标越界。lJava程序可以用代码来处理异常并继续执行程序可以用代码来处理异常并继续执行程序,而不是让程序中断。程序

2、,而不是让程序中断。lJava对异常的处理是对异常的处理是面向对象面向对象的。它提供了的。它提供了,专门用于处理程序运行期间的错误。每当,专门用于处理程序运行期间的错误。每当Java程序运行过程发生一个可识别的运行错误时,程序运行过程发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统会产生即该错误有一个异常类与之相对应时,系统会产生该该异常类的一个相应对象异常类的一个相应对象,即产生一个异常。,即产生一个异常。就是一个描述异常情况的类(这个类具就是一个描述异常情况的类(这个类具有存储问题信息的成员域)。当出现异常时,一个有存储问题信息的成员域)。当出现异常时,一个Excepti

3、on对象就产生了,并被放到产生这个异常对象就产生了,并被放到产生这个异常的方法里。的方法里。l异常对象一旦产生,系统中就一定有相应的机制来异常对象一旦产生,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。系统的损害,从而保证了整个程序运行的安全性。5.2 异常的类型异常的类型l异常总是标准类异常总是标准类的一些子类的对的一些子类的对象。象。Throwable类的两个直接子类,即类的两个直接子类,即类和类和类,覆盖了所有的类,覆盖了所有的。objectThrowableErrorExce

4、ptionClassAClassBClassCClassDError类被认为是不能恢复的严重错误,比如内存不够,字节码不合法等,由Java虚拟机生成并抛弃。一般性程序故障,一般由用户代码或类库生成并抛出。Exception类类l同其他的类一样,同其他的类一样,Exception类有自己的方法类有自己的方法和属性。它的构造方法有两个:和属性。它的构造方法有两个:public Exception();public Exception(String s);l第二个构造方法可以接受字符串第二个构造方法可以接受字符串s参数传入的参数传入的信息,该信息通常是对该异常所对应的错误信息,该信息通常是对该异常所

5、对应的错误的描述。的描述。lException类还从父类类还从父类Throwable那里继承了那里继承了若干方法,其中常用的有:若干方法,其中常用的有: public String toString() 返回描述当前Exception类信息的字符串。 public void printStackTrace() 打印当前异常对象的,即程序先后调用执行了哪些对象或类的方法,使运行过程产生了这个异常对象。两种两种Exception模式模式lJava 提供了两种提供了两种Exception 的模式,一种是执行的的模式,一种是执行的时候所产生的时候所产生的Exception (Runtime Excep

6、tion),另外一种则是受控制的另外一种则是受控制的Exception (Checked Exception)。RuntimeException异常通常由代码中的严重异常通常由代码中的严重错误产生,编译器错误产生,编译器。lRuntimeException 的子类有:的子类有:lArithmeticException出现非法算术操作出现非法算术操作lIndexOutOfBoundsException试图使用一个越试图使用一个越界的索引来引用一个对象界的索引来引用一个对象lNullPointerException对一个值为对一个值为null的对象进的对象进行操作行操作lIllegalArgume

7、ntException实参与形参的类型不实参与形参的类型不符符对于从对于从Exception类派生出来的所类派生出来的所有其他类,有其他类,编译器都会检查是否编译器都会检查是否已已经在可能抛出异常的方法中进行异经在可能抛出异常的方法中进行异常处理,常处理,已经指出该方法会抛已经指出该方法会抛出这样一个异常。出这样一个异常。5.3 异常处理异常处理lJava中异常处理机制可以概括为以下几个过程:中异常处理机制可以概括为以下几个过程:在在Java程序的执行过程中,如果出现异常,则自动程序的执行过程中,如果出现异常,则自动生成一个异常类对象,该异常对象将被提交给生成一个异常类对象,该异常对象将被提交

8、给Java运行时系统,这个过程称为运行时系统,这个过程称为抛出异常抛出异常。抛出异常也。抛出异常也可以由程序来强制进行。可以由程序来强制进行。当当Java运行时系统接收到异常对象时,会寻找能处运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,理这一异常的代码并把当前异常对象交给其处理,这一过程称为这一过程称为捕捉异常捕捉异常。如果如果Java运行时系统找不到可以捕获异常的方法,运行时系统找不到可以捕获异常的方法,则将终止,相应的则将终止,相应的Java程序也将退出。程序也将退出。Java的异常处理是通过的异常处理是通过5个关键字来实现的:个关键字来实现的:try

9、,catch,throw,throws和和finally。1. 捕捉异常捕捉异常lJava通过使用通过使用trycatchfinally语句来捕捉一个或多个异常,基本格语句来捕捉一个或多个异常,基本格式为:式为:ltryl 语句语句llcatch(异常类名异常类名1异常对象名异常对象名)l异常处理代码异常处理代码llcatch(异常类名异常类名2异常对象名异常对象名)l异常处理代码异常处理代码llfinallyl语句语句l其中一条try语句可以跟多个catch语句和一个finally语句,但try语句不能单独出现,必须至少有一个catch语句或finally。 try语句语句ltry语句用大括

10、号指定了一段代码,该代语句用大括号指定了一段代码,该代码可能会抛出一个或多个异常。若码可能会抛出一个或多个异常。若try块中出块中出现异常,则控制转向下面的异常处理部分,现异常,则控制转向下面的异常处理部分,然后执行后续语句,若然后执行后续语句,若try块中没有异常,则块中没有异常,则try块执行完后,控制转向后续语句。块执行完后,控制转向后续语句。 catch语句语句lcatch语句的参数类似于方法的声明,包括一语句的参数类似于方法的声明,包括一个异常类型和一个异常对象。异常类型必须个异常类型和一个异常对象。异常类型必须是是Throwsable的子类,它的子类,它,异常对象则由运行时系统在,

11、异常对象则由运行时系统在try所指定的代码块中生成并捕获,大括号中所指定的代码块中生成并捕获,大括号中包含对象的处理,其中可以调用对象的方法。包含对象的处理,其中可以调用对象的方法。lcatch语句可以有多个,分别处理不同类型的语句可以有多个,分别处理不同类型的异常。异常。Java运行时系统运行时系统对每个对每个catch语句处理的异常类型进行检查,直到找语句处理的异常类型进行检查,直到找到到的的catch语句为止。这里,类型匹语句为止。这里,类型匹配是指配是指catch所处理的异常类型与生成的异常所处理的异常类型与生成的异常对象完全一致或者是它的父类。因此,对象完全一致或者是它的父类。因此,

12、catch语句的排列顺序应该是语句的排列顺序应该是从特殊到一般从特殊到一般。l也可以用一个也可以用一个catch语句处理多个异常类型,语句处理多个异常类型,这时,它的异常类型应该是这多个异常类型这时,它的异常类型应该是这多个异常类型的的父类父类。程序设计中要根据具体的情况来选。程序设计中要根据具体的情况来选择择catch语句的异常处理类型。语句的异常处理类型。 finally语句语句lfinally语句是语句是的,如在的,如在trycatch之后接之后接上上finally语句,则无论有无异常,最后都语句,则无论有无异常,最后都必必须须执行执行finally块中的语句。块中的语句。finally

13、语句提供了语句提供了一个统一的出口,通常可以进行资源的清理一个统一的出口,通常可以进行资源的清理工作,如关闭打开的文件等。工作,如关闭打开的文件等。lpublic class testl public static void main(String arg)l int i=0;l String s =ok!,ok!,ok!;l while(i4)l tryl catch(ArrayIndexOutOfBoundsException e)l finallyl ll i+;l l l输出:ok!finally被执行!ok!finally被执行!ok!finally被执行!数组下标越界!finall

14、y被执行!2. 抛出异常抛出异常l在捕捉一个异常前,必须有一段在捕捉一个异常前,必须有一段Java代码生代码生成一个异常对象并把它抛出。抛出的代码可成一个异常对象并把它抛出。抛出的代码可以是自己编写的以是自己编写的Java程序,也可以是类库中程序,也可以是类库中的某个类,或者是的某个类,或者是Java运行时系统。它们都运行时系统。它们都是通过是通过throw语句来实现的。语句来实现的。lthrow语句的格式为:语句的格式为:throw ThrowableObject;lclass testl static int chu(int a,int b)l tryl if(b=0)l Arithmet

15、icException e=new ArithmeticException(除数不除数不能为能为0);l throw e;l l catch(ArithmeticException e)le.getMessage();l return 0;l l return a/b;l l public static void main(String arg)l int m=0;l m=chu(4,0);l l输出:除数不能为003. 声明异常声明异常l在方法中可以使用在方法中可以使用try-catch-finally来处理方来处理方法中抛出的异常。在有些情况下,方法并不法中抛出的异常。在有些情况下,方法并

16、不需要处理它所生成的异常,而是需要处理它所生成的异常,而是由调用它的由调用它的方法来处理这些异常方法来处理这些异常,这时就要用到,这时就要用到throws子句,它包含在方法的声明中。子句,它包含在方法的声明中。l其格式如下:其格式如下: 返回类型返回类型 方法名方法名(参数列表参数列表) throws 异常列表异常列表l其中,在异常列表中可以声明多个异常,用其中,在异常列表中可以声明多个异常,用逗号隔开。逗号隔开。lpublic class testlstatic int chu(int a,int b) throws ArithmeticExceptionl if(b=0)lArithmet

17、icException e=new ArithmeticException(除数除数不能为不能为0);lthrow e;l l return a/b;l lpublic static void main(String arg)l int m=0;l tryl m=chu(4,0);l catch(ArithmeticException e)l lll输出:除数不能为05.4 创建自定义异常创建自定义异常lJava类库中定义的异常主要用来处理系统可类库中定义的异常主要用来处理系统可以预见的、比较常见的运行错误。如果某个以预见的、比较常见的运行错误。如果某个应用程序有特殊的要求,则可能出现系统不应

18、用程序有特殊的要求,则可能出现系统不能识别的运行错误。这时,用户就需要自己能识别的运行错误。这时,用户就需要自己创建异常和异常类,使系统能够识别这种错创建异常和异常类,使系统能够识别这种错误并进行处理。误并进行处理。创建用户自定义的异常时,一般需要完成创建用户自定义的异常时,一般需要完成以下工作:以下工作:l声明一个新的异常类,使之继承声明一个新的异常类,使之继承Exception、Exception类的子类或用户自定义的异常类。类的子类或用户自定义的异常类。格式如下:格式如下:class 自定义异常类名自定义异常类名extends 父异常类名父异常类名 类体类体l为新的异常类定义属性和方法,

19、或重载父类的属性和方法,为新的异常类定义属性和方法,或重载父类的属性和方法,使之能够体现出程序中出现的这种异常信息。使之能够体现出程序中出现的这种异常信息。l抛出用户自定义的异常。抛出用户自定义的异常。用户自定义的异常不可能依靠系用户自定义的异常不可能依靠系统自动抛出,而必须通过统自动抛出,而必须通过throw抛出。抛出。例:计算例:计算0100之间的两个整数之和之间的两个整数之和lpackage myclass;lclass NumberRangeException extends Exceptionl public NumberRangeException()l super();l l p

20、ublic NumberRangeException(String msg)l super(msg);l llclass Ml public static String sum(String s1,String s2) throws NumberRangeExceptionl int a=Integer.parseInt(s1);l int b=Integer.parseInt(s2);l if(a100)|(b100)l throw (new NumberRangeException(输入的数字输入的数字超出范围!超出范围!);l l return Integer.toString(a+b)

21、;l llpublic class testl public static void main(String args)l tryl String s=M.sum(args0,args1);l catch(NumberRangeException e)l e.printStackTrace();l catch(Exception e)l e.printStackTrace();l l ljava myclass.test -2 5输出: 错误:输入的数字超出范围!NumberRangeException: 输入的数字超出范围! at M.sum(test.java:15) at test.ma

22、in(test.java:24)异常程序例异常程序例P116-11l编程实现,使用编程实现,使用catch(Exception e)来捕获来捕获所有异常,在所有异常,在catch代码块中使用代码块中使用instanceof针对不同的异常分别处理。针对不同的异常分别处理。linstanceof是是Java的一个二元操作符,它的的一个二元操作符,它的作用是作用是测试它左边的对象是否是它右边的类测试它左边的对象是否是它右边的类的实例的实例,返回,返回类型的数据。类型的数据。l例:例:String s = I AM an Object!;boolean isObject = s instanceof Object;lclass ExceptionA extends Exceptionlpublic ExceptionA()llpublic ExceptionA(String messa

温馨提示

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

评论

0/150

提交评论