1、邯郸学院计算机系 张延军,第四章 Java异常处理,教学目标,4.1 Exception的概念、子类及其继承关系 4.2 面向对象的异常处理机制 4.3 创建自定义异常,教学目标,4.1 Exception的概念、子类及其继承关系4.1.1 Exception的概念4.1.2 Exception的分类4.1.3 Exception的继承关系和层次4.1.4 方法调用堆栈 4.2 面向对象的异常处理机制4.2.1 异常处理语句(try-catch-finally)4.2.2 在方法首部用throws抛出异常4.2.3 在方法体中用throw手工抛出异常4.2.4 程序示例 4.3 自定义异常,引
2、言,在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。 以面向过程语言C语言为例,一般通过使用if语句来判断是否出现了错误,同时,调用函数通过被调用函数的返回值感知在被调用函数中产生的错误事件并进行处理。 没有错误处理的程序: openTheFile;determine its size;allocate that much memory;read-filecloseTheFile; ,引言,openFiles; if (theFilesOpen)determine the length of the fi
3、le;if (gotTheFileLength) allocate that 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;,try openTheFile;determine its size;allocate that much memory;read-File;closeTheFile; catch(fileo
4、penFailed) dosomething; catch(sizeDetermineFailed) dosomething; catch(memoryAllocateFailed) dosomething; catch(readFailed)dosomething; catch(fileCloseFailed) dosomething; finally dosomething; ,面向过程和面向对象异常处理机制对比,4.1.1 Exception的概念,异常(Exception)是指程序运行过程中出现的可能发生会打断程序正常执行的事件或现象,例如用户输入错误、除数为零、需要处理的文件不存在、
5、数组下标越界、内存不足等。 为了加强程序的鲁棒性(Robust),程序设计时,必须考虑到可能发生的异常(Abnormal)事件并做出相应的处理。 Java提供了功能强大的面向对象异常处理机制,可以方便地在程序中监视可能发生异常的程序块,并将所有异常处理的代码集中放置在程序某处,使完成正常功能的程序代码与进行异常处理的程序代码分开,便于程序的阅读、修改和维护。,4.1.1 Exception的概念,在Java中将异常情况分为Error 和Exception两大类。 Error类: 指较少发生的内部系统错误,由JVM生成并抛出,包括动态链接失败、JVM内部错误、资源耗尽等严重情况,程序员无能为力,
6、只能让程序终止。 Exception类: 解决由程序本身及环境所产生的异常,有补救或控制的可能,程序员也可预先防范。,4.1.1 Exception的概念,Throwable类:具体请参考帮助文档。 构造方法: Throwable() 构造方法: Throwable(String message) String toString():返回形如“classname”“getMessage()”的信息 。 String getMessage() : 返回有关异常事件的信息。 String getLocalizedMessage() void printStackTrace():用来跟踪异常事件发生
7、时的执行堆栈的内容 void printStackTrace(PrintStream s) void printStackTrace(PrintWriter s) Throwable fillInStackTrace(),4.1.2 Exception的分类,Java语言中Exception可以分为: 检查性异常(Checked Exception):一般程序中可预知的问题,其产生的例外可能会带来意想不到的结果,因此Java编译器要求Java程序必须捕获或声明所有的非运行时异常必须进行异常处理,否则编译不能通过。例如以IOException为代表的一些类如FileNotFoundExcepti
8、on、用户连接数据库时产生的SQLException等。 非检查性异常(Unchecked Exception):以RuntimeException为代表的一些类,编译时发现不了,只在能运行时才能发现。 Runtime Exception:Java虚拟机在运行时生成的例外,如被0除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响不太大。因此由系统检测, 用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。,ClassNotFoundExceptionClassNotSupportedExceptionIllegalAccessEx
9、ception IntantiationException InterruptedExceptionNoSuchMethodExceptionRuntimeExceptionArithmeticExceptionArrayStoreExceptionIllegalArgumentExceptionIllegalThreadStateExceptionNumberFormatExceptionIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionStringIndexOutBoundsExceptionNegative ArraySizeE
10、xceptionNullPointerExceptionSecurityException,4.1.2 Exception的分类,4.1.2 Exception的分类,Java程序异常处理的原则: 对于Error和RuntimeException,可以在程序中进行捕获和处理,但不是必须的。 对于IOException及其他异常,必须在程序进行捕获和处理,否则,程序不能通过编译。异常处理机制主要处理检查性异常。 我们可以从JDK帮助文档中查找一个方法可能抛出的异常,然后有针对性的处理。 例程: ZeroExceptionTest.java 例程:TestIOExcption1.java 说明:从
11、当前文件夹文本文件test1.txt读出内容,输出到屏幕上。 由于没有检测异常FileNotFoundException和IOException并做出处理,编译不能通过。,4.1.4 方法调用堆栈,例程:codeMethodCallTest.java 01 public class Test 02 int arr=new int3; 03 public static void main(String args) 04 new Test().methodOne(); 05 System.out.println(“main“); 06 07 public void methodOne() 08 m
12、ethodTwo(); 09 System.out.println(“One“); 10 11 public void methodTwo() 12 methodThree(); 13 System.out.println(“Two“); 14 15 public void methodThree() 16 System.out.println(arr3); 17 System.out.println(“Three“); 18 19 ,4.1.4 方法调用堆栈,Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException
13、: 5at Sample.methodThree(Sample.java:17)at Sample.methodTwo(Sample.java:13)at Sample.methodOne(Sample.java:9)at Sample.main(Sample.java:5) Press any key to continue.,methiodThree(),methiodTwo(),methiodOne(),main(),教学目标,4.1 Exception的概念、子类及其继承关系4.1.1 Exception的概念4.1.2 Exception的分类4.1.3 Exception的继承关系
14、和层次4.1.4 方法调用堆栈 4.2 面向对象的异常处理机制4.2.1 异常处理语句(try-catch-finally)4.2.2 在方法首部用throws抛出异常4.2.3 在方法体中用throw手工抛出异常4.2.4 程序示例 4.3 自定义异常,4.2 面向对象的异常处理机制,异常处理的方法: 使用trycatchfinally结构对异常进行捕获和处理。 在方法声明首部用throws声明抛出异常:JVM将类载入内存,调用main()类的入口方法,main()方法调用其它方法。异常处理机制采用谁调用,谁就负责处理被调用方法抛出的异常。 在方法体中用throw手工抛出异常。,4.2.1
15、异常处理语句(try-catch-finally),1. trycatchfinally结构 语法格式: try . ./code that might generate exception catch(type1 id1) . ./handle exception of type1 catch(type2 id2) . ./handle exception of type2 finally /activities that happen every time ,4.2.1 异常处理语句(try-catch-finally),finally的语句块无论异常是否发生都要执行,是trycatch的
16、统一出口,一般用来处理“善后处理”,例如释放资源,关闭使用完的文件等。 一个try语句块可对应多个catch块,用于对多个异常类进行捕获。如果要捕获的异常类之间有父子继承关系时,应该将子类的catch块放置在父类的catch块之前。 例程:TestIOExcption2.java 说明:使用try.catchfinally结构处理异常。,4.2.1 异常处理语句(try-catch-finally),4.2.2 在方法首部用throws声明抛出异常,2. throws声明抛出异常:如果一个方法没有捕获可能引发的异常,调用该方法的其他方法应该捕获并处理该异常。这就需要声明方法的时候,使用thro
17、ws选项,以抛出该异常。语法格式:()throws Exception 例程:TestIOExcption3.java 说明:在main()方法定义首部声明抛出异常FileNotFoundException, IOException,谁调用谁处理。 例程:TestIOExcption4.java 说明:将功能进行划分,main()只负责测试,readFile()负责从指定文件中读出内容并输出到方法定义时抛出异常。FileNotFoundException,IOException,谁调用谁处理,这里main()调用readFile()。,4.2.3 在方法体中用throw手工抛出异常,3.thr
18、ow抛出异常,可以是系统定义的异常,也可以是用户自定义的异常。 语法格式:throw new (实参表),教学目标,4.1 Exception的概念、子类及其继承关系4.1.1 Exception的概念4.1.2 Exception的分类4.1.3 Exception的继承关系和层次4.1.4 方法调用堆栈 4.2 面向对象的异常处理机制4.2.1 异常处理语句(try-catch-finally)4.2.2 在方法首部用throws抛出异常4.2.3 在方法体中用throw手工抛出异常4.2.4 程序示例 4.3 自定义异常,4.3 创建自定义异常,Java语言允许用户在需要时创建自己的异常
19、类型,用于表述JDK中未包括的其他异常情况。这些类型必须继承Thowable或其子类,一般继承Exception类。依据命名惯例,应以Exception结尾。 class MyException extends Exceptionprivate int idnumber;/覆盖MyException默认的构造方法public MyException(String message,int id)super(message);/调用父类的构造方法。this.idnumber=id;public int getId()return idnumber; ,4.3 创建自定义异常,用户自定义异常未被加入
20、JRE的控制逻辑中,因此永远不会自动抛出,只能由手工创建并抛出,请查阅JDK文档Exception类的内容。 语法格式:throw new (实参表),4.3 创建自定义异常,例程:ThrowTest.java 功能:本程序演示用户自定义异常和人工抛出异常。,回顾本章内容,4.1 Exception的概念、子类及其继承关系4.1.1 Exception的概念4.1.2 Exception的分类4.1.3 Exception的继承关系和层次4.1.4 方法调用堆栈 4.2 面向对象的异常处理机制4.2.1 异常处理语句(try-catch-finally)4.2.2 在方法首部用throws抛出异常4.2.3 在方法体中用throw手工抛出异常4.2.4 程序示例 4.3 自定义异常,