版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 Java例外处理本章要点通过本章的学习 ,主要了解例外的概念,作用和例外的产生,掌握怎样捕捉例外,怎样创建自己的例外类,以及怎样利用Java开发环境提供的例外类来处理程序中的例外。通过技能训练,掌握Java语言中例外处理的基本技术。61 概述例外就是在程序运行时由代码所产生的不正常状态。换句话说,例外就是一个运行错误。在不支持例外处理的计算机语言中,错误必须由人工进行检查和处理,这显然麻烦而低效。Java语言提供了例外处理机制,为方法的例外终止和出错处理提供了清楚的接口。例外(exception)也是例外事件(exceptional event)的简称,它是在程序运行中出现的违背正常流
2、向的事件。许多不同种类的错误可以导致例外,从严重的硬件错误到简单的编程错误。当在Java方法中发生这样的错误时,方法将创建一个例外对象,并把它交给运行系统处理,运行系统负责找到处理错误的代码并执行之。例外对象包括例外的信息、类型和错误发生时程序的状态以及对该错误的详细描述。在Java中,创建一个例外对象并把它送到运行系统叫做抛弃例外。在抛弃例外后,运行系统将寻找合适的方法来处理例外。如果产生的例外类与所处理的例外一致,则认为找到了合适的例外处理方法。如果运行系统找遍了所有方法而没有找到合理的例外处理方法,则运行系统将终止Java程序的运行。例外处理也叫做捕捉例外。Java中的每个例外都是一个对
3、象,它是java.lang包中Throwable类或其子类的实例对象。Throwable类有两个子类:Exception类和Error类。Exception类是可以被捕捉并且可能恢复的例外类,也可以继承Exception类生成自己的例外类。Error类一般被认为是不可恢复和不可捕捉的例外类。62 例外的的类型Java.lang.ObjectJava.lang.ThrowableJava.lang.ErrorJava.lang.Exception各种错误子类Java.lang.RuntimeExceptionJava.lang.Non_RuntimeException各种运行异常子类各种非运行异
4、常子类 图6.1 例外类的层次621 例外类的层次结构Java语言用继承的方式来组织各种例外。所有的例外都是Throwable类或子类,而Throwable类有直接继承于object类。Throwable类有两个子类Error类与 Exception类。Exception类又进一步细分为RuntimeException(运行时例外)类和Non-RuntimeException(非运行时例外)类。图6.1显示了个例外之间的继承关系。如果程序中可能产生非运行时例外,就必须明确地加以捕捉并处理,否则就无法通过编译检查。与非运行例外不同的是,错误(Error)与运行例外(RuntimeExceptio
5、n)不需要程序明确地捕捉并处理。622 Exception 类及其子类Exception类分为RuntimeException(运行时例外)类和Non-RuntimeException(非运行是例外类)类。1. 运行时例外运行时例外表现在Java运行系统执行过程中的例外,它是指Java程序在运行时发现的由Java解释抛弃的各种例外,包括算术例外,下标例外等等。表6.1列出几种常见的例外。表6.1 几种常见的运行时例外例外类名功能说明ArithmeticException除数为零的例外IndexOutOfBoundsException下标越界例外ArrayIndexOutOfBoundsExce
6、ption访问数组元素的下标越界例外StringIndexOutOfBoundsException字符串下标越界例外ClassCaseException类强制转换例外NullpointerException当程序试图访问一个空数组中的元素,或访问一个空对象中的方法或变量时产生的例外2. 非运行是例外非运行是例外是由编译器在编译时检测是否会发生在方法的执行过程中的例外。非运行例外是Non-Runtimeexception及其子类的实例,可以通过throws语句抛弃。Java在其标准包Java.lang、java.util、java.io、中定义的例外类都是非运行时例外类。表6.2
7、列吃了常见的非运行时例外。表6.2 非运行例外例外类名功能说明ClassNotfoundException指定类或接口不存在的例外IllegalAccessException非法访问例外IOException输入输出例外FileNotFoundException找不到指定文件的例外ProtocolException网络协议例外SocketExceptionSocket操作例外MalformedURLException统一资源定位器(URL)的格式不正确的例外623 Error类及其子类Error类定义了正常情况下不希望捕捉的错误。在捕捉Error子类时要多加小心,因为它们通常在出现灾难性错误时
8、被创建。表6.3列出一些常见的Error例外类。表6.3 Error例外类例外类名功能说明LinkageError动态链接失败VirtualMachineError虚拟机错误AWTErrorAWT错误63 Java例外产生于捕捉631 产生例外通过下面两个引例来认识例外的产生。引例1import java.io.*;class Exception1public static void main(String args)FileInputStream fis=new FileInputStream(text);int b;while(b=fis.read()!=-1)System.out.pri
9、nt(char)b); fis.close();该引例的第6行表明在一个文件“text”上建立文件输入流。运行此程序时,如果这个文件并不存在,就会产生例外。另外,第8行是读此文件的内容,如果该文件不存在,则从此文件中读取数据时,也可能发生例外。引例2class Exception2public static void main(String args)int a=0,b=0;a=36/b;System.out.println(a=+a);从该引例的 第6行不难看出,除数为零。因此,运行此程序时必然会发生除零溢出的例外事件,使程序无法继续运行。上面的两个引例都有或可能有例外产生。对于一些例外,在
10、程序中必须对它进行处理,否则编译程序时会指出错误,如引例1;但对另一些例外,在程序中可以不做处理,而直接由运行系统来处理,如引例2。632 捕捉例外一个方法中如果对某种类型的例外对象提供了相应的处理代码,则这个方法就可以捕捉对应的例外。捕捉例外就是通过try-catch-finally语句实现的。其语法为try正常程序段,可能抛弃例外;catch(例外类1 例外变量) 捕捉例外类1有关的处理程序段;catch(例外类2 例外变量)捕捉例外类2有关的处理程序段;finally 退出例外处理程序段;1. try用来监视所在的程序块是否发生例外,如果发生例外就抛弃它。对于系统产生的例外或程序块中未用
11、try监视所产生的例外,将一律被Java运行系统自动抛弃。2. catch用来捕捉try程序块中所抛弃的例外,并根据例外类型采取相应的方法进行处理,每个try程序块后面紧接着一个或多个catch语句,用于捕捉try程序块中所抛弃的一个或多个例外。catch语句只需要一个形式参数,参数类型给出它能够捕捉的例外类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的例外对象传递给catch块,在catch快中时对例外对象进行处理的代码。例6.1 捕捉引列1中的例外。import java.io.*;class Exception3 public static void main(
12、String args)tryFileInputStream fis=new FileInputStream(text);int b;while(b=fis.read()!=-1)System.out.print(char)b);fis.close();catch(FileNotFoundException e)System.out.print(e);catch(IOException e)System.out.print(e); 这里使用了两个catch语句分别对try代码块中可能出现的两个例外事件进行处理。第一种情况,如果要打开的文件“text”在当前目录中不存在,程序运行时会抛弃一个Fi
13、leNotFoundException例外对象,由于第一个catch语句与该例外类型匹配,所以程序将执行第一个catch语句,于是就会显示下面的信息:java.io.FileNotFoundException:text(系统找不到指定文件。)一般地,程序中如果有多个catch语句,那么,若有一个catch语句的例外与抛弃的例外对相匹配,那么,此catch语句将被执行,其他catch语句将被忽略。此例中,由于第一个catch语句首先得到匹配,第二个catch语句将不会被执行。因此在安排catch语句的顺序时,首先应该捕捉最特殊的例外,然后再逐渐一般化。通常在指定所捕捉的例外类型时,应该避免选择最
14、一般的类型(如Exception)。否则,当例外事件发生时,程序中不能确切判断异常的具体类型并做出相应处理以从错误中恢复。第二种情况,如果要打开的文件“text”在当前目录中存在,程序的运行结果会显示“text”文件中的内容。3. Finally捕捉例外的最后一步是通过finally语句为例外吃力提供一个统一的出口,使得在控制流转到程序的其他部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了例外事件,finally代码块中的语句都会被执行。例6.2 finally语句语句作用。import java.io.*;class Exception4 public static v
15、oid main(String args) throws IOExceptionFileInputStream fis=null;tryfis=new FileInputStream(text);System.out.println(text文件的内容是:);int b;while(b=fis.read()!=-1)System.out.print(char)b);catch(FileNotFoundException e)System.out.print(e);catch(IOException e)System.out.print(e);finallyif (fis!=null)Syste
16、m.out.println(正在关闭文件);fis.close();elseSystem.out.println(文件没有打开!);如果要打开的文件“text”在当前目录中不存在,程序的运行结果如下:java.io.FileNotFoundException:text文件没有打开!这种情况下,finally语句被执行。如果要打开文件“text”在当前目录中存在,且“text”文件中的内容为:“let us begin learn java.”,则程序的运行结果如下:text文件的内容是:let us begin learn java.正在关闭文件.这种情况下,finally语句仍被执行。4.
17、抛弃例外:throwthrow语句明确地抛弃一个例外。throw语句的一般格式:throw ;其中必须是Throwable类或其子类的一个对象,简单数据不能用于例外。throw语句会中断程序流的执行,其后的语句将不会被执行。系统会检测离throw最近的try块,看是否存在与throw语句抛弃的例外类型相匹配的catch语句。如果找到匹配的catch语句,则控制转到catch语句中。如果没找到匹配的catch语句,这个程序将被中断。下面的程序产生并抛弃了一个异常,捕捉到这个例外的处理又抛弃一个例外到外部调用方法的处理中。例6.3 利用throw语句抛弃例外的例子。public class Exc
18、eption5 static void demoproc()trythrow new NullPointerException(demo);/抛弃一个例外catch(NullPointerException e)System.out.println(捕捉内部例外.);/捕捉demoproc内部例外throw e;/抛弃另一个例外public static void main(String args)trydemoproc();catch( NullPointerException e)System.out.println(再次捕捉例外:+e);/再次捕捉例外从程序结构中可以看到,main()方
19、法创建了一个例外处理块,在demoproc()方法中创建了另一个例外处理块。所以,这个程序有两次机会处理同一个错误。执行此程序时,首先调用 demoproc() 方法。在demoproc()中先抛弃一个NullPointerException例外,由demoproc()内部的catch语句捕捉到,输出“捕捉内部例外”字样后,在抛弃一个同样的例外。由于该异常在demoproc()方法中不能被捕捉到,所以只能被main()方法中的catch语句捕捉到并处理之。因此,程序的运行结果如下:捕捉内部例外再次捕捉例外:java.lang.NullPointerException:demo5. 生命抛弃例外
20、:throws如果一个方法可能抛弃一个例外而它自己又没有处理方法,那么例外处理的任务就交给调用者去完成,此时,必须在方法中包括throws子句,以便该方法的调用者捕捉该例外。一个throws子句列出了一个方法可能抛弃的例外类型。包括子throws句的方法声明的一般格式如下: 方法名(参数列表) throws 方法体:下面的程序试图抛弃一个它不捕捉的例外,因为这个程序没有指定一个throws子句来声明抛出例外,所以程序不能编译通过。例6.4 无声明的抛弃例外。public class Exception6 static void throwOne()System.out.println(抛弃内部
21、例外.);throw new IllegalAccessException(demo);public static void main(String args)throwOne(); 为了使这个程序编译成功,需要进行两处修改。首先,需要声明方法throwOne()抛弃了IllegalAccessException例外。然后,必须在main()中定义try-catch语句来捕捉这个例外。修改后的正确程序如下。例6.5 声明抛弃例外。public class Exception7 static void throwOne() throws IllegalAccessExceptionSystem.
22、out.println(抛弃内部例外.);throw new IllegalAccessException(demo);public static void main(String args)trythrowOne();catch(IllegalAccessException e)System.out.println(捕捉到例外为:+e); 运行结果如下:抛弃内部例外.捕捉到例外为:java.lang.IllegalAccessException: demo633 创建自己的例外类尽管Java的内部例外可以处理大多数的一般错误,但有时还要创建自己的例外类型来处理特定的情况。实际上,定义自己得外
23、类非常简单,只需要定义一个Exception类的子类即可。Exceotion类并没有定义它自己的任何方法,它继承了Throwable类提供的方法,所以,任何例外,包括自己建立的例外,都继承了Throwable定义的方法,也可以在自定义的例外类中覆盖这些方法中的一个或多个方法。例6.6 创建自己的例外类。class MyException extends Exceptionint num=0;MyException()num+;String show()return 自己的例外,序号为:+num;class DemoExcepstatic void Demo(int n) throws MyEx
24、ceptionSystem.out.println(n=+n);if(n200)System.out.println(没有例外产生1);return ;elsethrow new MyException();public static void main(String args)tryDemo(75);Demo(250);catch(MyException e)System.out.println(捕捉到例外为:+e.show(); 运行结果如下:n=75没有例外产生1n=250捕捉到例外为:自己的例外,序号为:1自己所创建的例外类,在使用上和Java所提供的例外类一样,因此,只要根据前面所介
25、绍的例外使用方法,就可以使用自己创建的例外类了。634 应用实例例6.7 多种例外处理的实例。class MultiExcep static void Demo(int n)int a=0,b=0;int arr=new int5;switch(n)case 0:a=38/b;break;case 1:arr17=23;break;public static void main(String args)int i;for(i=0;i2;i+)trySystem.out.println(i=+i);Demo(i);catch(ArithmeticException e)System.out.println(除数为零例外!);catch(ArrayIndexOutOfBoundsException e)System.out.println(数组下标越界例外:+e);finallySystem.out.println(执行finally代码块!);运行结果如下:i=0除数为零例外!执行finally代码块!i=1数组下标越界例外:java.lang.ArrayIndexOutOfBoundsEx
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扶恤金分配协议书
- 工程维保协议书
- 家教签合同还协议
- 小吃培训合同范本
- 英欧协议书范本
- 销售独家协议合同
- 装修拆旧协议书
- 资料印制协议书
- 药材销售协议书
- 装潢合同协议书
- 2024-2025学年贵州省六盘水市高一(上)期末英语试卷
- 炼焦机械与设备试题题库(300) 与答案
- 实施指南(2025)《DL-T 1034-2016 135MW级循环流化床锅炉运行导则》
- 员工培训法律法规知识课件
- 2025年全国《征兵入伍》应知应会知识试题与答案
- 2025AICon全球人工智能开发与应用大会-深圳站:具身智能技术在工程机械智能化中的应用实践
- 文旅景区2025年运营风险评估与安全风险防控方案分析
- 蜂蛰伤护理试题及答案
- 2025年陕西省专业技术人员继续教育公需课试题及答案
- 肾内科科室简介
- 消防清包工劳务合同范本
评论
0/150
提交评论