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

下载本文档

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

文档简介

1、第六章异常处理,学习目标,1理解错误和理想是什么。2熟悉异常对象类型和异常处理机制。3掌握异常处理编程技术。4您可以设置自己的例外类。6.1例外概述、1、错误和例外根据错误特性将执行错误分为错误和例外两类茄子。1致命错误(例如,程序进入循环、递归结束或内存溢出)称为错误。2在运算中除数为零、操作数超出数据范围、打开文件时没有发现文件、没有要加载的类文件或者网络连接中断等非致命异常称为异常。1例外发生程序遇到例外时,生成例外事件,创建例外对象并将其提交给运行系统,然后在运行系统中查找相应的代码并处理例外。牙齿过程称为throw(抛出)异常。异常对象可以由Java虚拟机创建,也可以由正在运行的方法

2、创建。2发生异常异常后,运行时系统将从生成对象的代码开始,沿方法的调用栈层次反向查找异常对象,直到包含相应的处理方法并将异常对象传递给该方法为止。牙齿过程称为捕获(catch)异常。3异常处理类层次结构Java通过错误类(Error)和异常类(Exception)处理错误和异常,它们都是Throwable类的子类,分别用于处理两组异常。它们的层次结构如图6-1所示。4程序处理错误和异常的三种茄子方法,程序无法处理的错误Error类是错误类。程序应避免的异常不需要对运行时异常类(RuntimeException)使用try-catch-finally语句,例如数组超出范围。应尽量避免这些异常,而

3、不是通过节目调试捕获。必须捕获的异常某些异常是写入文件时无法预测的异常(例如,在文件中找不到异常、网络通信失败异常等)。因此,为了确保程序的健壮性,Java必须对可能出现此类异常的代码使用try-catch-finally语句。否则,编译将失败。示例6.1文件中的异常类import Java . io . *;public classtry 3 public static void main(string args)file input stream fis=new file input stream(autoexec . bat);system . out . print ln(I can

4、not found this file!);5常见公共异常类,常见异常类是RuntimeException的子类。算术异常ArithmeticException null指针异常NullPointerException类型强制转换异常ClassCastException数组下标异常NegativeArraySizeException数组下标异常arrayindexoutofboundseption数组下标异常示例6.2生成数组下标超出范围的异常和除数为零的异常,public classtry 1 public static void main(string args)int I=0。Int a

5、=5,6,7,8;for(I=0);i5;I)system . out . print ln(a I=ai);2,try-catch-finally语句用于捕获和处理异常,在Java的异常处理机制中提供try-catch-finally语句以捕获和处理trycatch (excel)语法格式的一个或多个异常时处理的代码。ExceptionType1表示异常类,e是该对象。无论是否捕获异常错误,以后都必须运行的代码。Catch语句可以有一个或多个catch语句,但是必须至少有一个catch语句,才能省略finally语句。Try-catch-finally语句的作用是,当Try语句中的代码生成异

6、常时,根据异常,由其他catch语句中的代码捕获和处理异常。如果没有异常,则不会执行catch语句。无论是否捕获了异常,都必须运行finally的代码。,示例6.3异常错误捕获和处理,public class try 2 public static void main(string args)int I=0;Int a=5,6,7,8;for(I=0);i5;I)try system . out . print ln(a I=ai);catch(arrayindexoutofboundsexceptione)system . out . print ln(数组下标超出范围例外!);finall

7、ysystem . out . print ln(fianly I=I);try语句try语句大括号内的牙齿代码可以引发一个或多个异常。也就是说,如果代码片段可以在运行时引发异常,则应使用try语句捕获异常。我们将通过牙齿示例进一步探讨try-catch-finally语句和使用时需要注意的问题。catch语句catch语句的参数类似于包含异常类型和异常对象的方法声明。Catch语句可以有多个茄子异常,每个异常都可以处理不同类的异常。Java运行时系统从上到下分别检测每个catch语句处理的异常类型,直到找到与类型匹配的catch语句。如果程序引发的异常与所有catch处理的异常不匹配,则Ja

8、va虚拟机将捕获并处理牙齿异常,这与不使用try-catch-finally语句相同。这显然不是我们预期的结果。因此,通常使用catch语句时,最后捕获所有名为Exception的异常的超类,以便异常由对象本身捕获和处理。在限制为finally语句try的代码中,当异常发生时,不会执行后续代码。使用Finally语句时,无论在try指定的节目块中发生异常,还是catch语句中的异常类型与遇到的异常类型匹配,finally指定的代码都将执行,以提供一致的出口。牙齿的门可以省略。6.3引发异常,1,使用throw语句引发异常throw语句以异常格式throw,其中throw是关键字,是生成的异常类

9、对象。示例6.4异常错误,public classtry 5 public void run(byte k)byte y=1,I=1;System.out.print(k!=);/换行输出for(I=1;IByte。MAX_VALUE/i) /Integer类的常量,表示最大值throw new Exception(overflow)。/溢出过程中出现异常else y=(byte)(y * I);catch(exceptione)system . out . print ln(exception : e . get message();e . printstacktrace();/显示异常信息

10、system . exit(0);system . out . print ln(y);public static void main(string args)try5a=new try 5();for(byte I=1;I10I)a . run(I);2,引发异常的方法和调用方法处理异常,引发异常的方法在方法声明中附加throws子句,表示引发异常。具有Throws子句的方法的宣言格式如下:()throws其中throws是关键字,是方法将引发的异常类,可以将多个异常类声明为逗号分隔符。注:必须在语法和使用方面区分throws子句和throws。调用方法处理异常时,异常在一个方法抛出后向上传

11、播,并由调用它的方法处理。示例6.5异常引发方法和调用方法处理异常,public classtry 6 public void calc(byte k)throws exception/异常引发byte y=1,I=1;System.out.print(k!=);for(I=1);IByte。MAX_VALUE/i) /Integer类的常量,表示最大值throw new Exception(overflow)。/溢出过程中出现异常else y=(byte)(y * I);catch(exceptione)system . out . print ln(exception : e . get

12、message();e . printstacktrace();system . exit(0);system . out . print ln(y);Public void run(byte k) /异常try calc(k)捕获和处理:Catch(exceptione)system . out . print ln(exception 3360 e . gene . printstacktrace();system . exit(0);public static void main(string args)try6a=new try 6();for(byte I=1;I10I)a . ru

13、n(I);3,方法处理异常传递系统,对于需要程序处理的异常,通常编写try-catch-finally语句以捕获和处理。如果程序无法处理需要系统处理的异常,则可以使用throw语句,使方法抛出异常交叉系统处理。例如,对于档案流作业,系统将处理需要捕获的系统定义的异常。,public class Demo1/异常使用示例static int a,b,c;public static void main(string args)try a=100;b=integer . parseint(args 0);if(b=13)throw(new arithmetic exception();/方法引发异常

14、c=a/b;system . out . print ln(a/b=c);catch(arrayindexoutofboundsexceptione)system . out . print ln(没有命令行第一个参数);catch(arithmetic exception e)system . out . print ln(算术错误);6.4自定义异常类,Java中已经预定义了很多异常类,但是在某些情况下,程序员本身不仅必须抛出异常,还必须创建自己的异常类。此时,您可以创建Exception的子类,以定义自己的异常类。Java异常类系统不包含所需的异常类型。用户必须将自己提供的类的例外与其他

15、人提供的例外区分开来。牙齿类型的异常在类中多次发生。使用在其他包中定义的异常类会影响包的独立性和自包含性。有一些茄子说明,可以告诉读者何时需要自定义异常类。要满足以下一个或多个条件,您必须考虑定义自己的例外类:示例6.6自定义异常类,类myexception extends exception/自定义异常类my exception()my exception(string msg)super(msg)Class UsingMyException /引发异常类void f()throws my exception system . out . print ln(throws my excepti

16、on from f()Throwvoid g()throws my exception system . out . print ln(throws my exception from g();throw new my exception(originated in g();Public class TestMyException /捕获和处理异常错误public static voidmain(string args)using my exception m=new using my exception()catch(my exceptione)e . print stack trace()

17、;try m . g();catch(my exceptione)e . print stack trace();6.5项目扩展,public class shuzu Yichang public static void main(string args)intnums=new int 10;for(int I=0);I=10I)try num si=I 1;catch(arrayindexoutofboundsexceptione)system . out . print ln(数组下标超出限制导致异常:e);finally if(i10)system . out . print ln(I=I,num si=num si);编写捕获和处理数组下标超出范围的异常的程序,如下所示:(1)打开“记事本”软件,然后输入以下节目内容:(2)以上程序中定义的数组范围为number0number9。当I循环到10时,数组超出限

温馨提示

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

评论

0/150

提交评论