1、任务14 Java异常处理的应用,教学目标 任务,教学目标,深刻理解 java 语言中独特的异常处理机制,掌握处理问题的方法。异常处理是java语言中一个独特之处,主要使用捕获异常和声明抛弃异常两种方法来处理程序中可能出现异常的语句块。,本章首页,12.1 异常与异常类 12.2 异常处理 12.3 创建用户自己的异常,任务,本章首页,12.1 异常与异常类 异常的概念,在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。 所谓异常,是指由于程序运行时发生错误,从而导致程序错误结束。Java给程序员提供了处理
2、运行时错误的功能,称为异常处理。没有异常处理代码的程序,在运行时发生错误则可能非正常结束,引起严重问题。例如,程序将钱从储蓄账户转账到经常账户时,当钱从储蓄账户提出还未存入经常账户时,由于运行时错误,程序终止,用户就会损失掉这笔钱。,12.1 异常与异常类 无异常处理的实例,例如,下面是一段没有错误处理的程序,由于除数为0,会引起数值计算错误而导致程序非正常终止。,public class Test public static void main(String args)System.out.println(9/0);,在Java中,可以将上述代码用下面的代码代替,来处理这个错误。其中使用了一
3、种称为try-catch块的新结构,它可以使程序捕获错误,进而进行相应处理,让程序得以继续进行:,public class Test public static void main(String args)trySystem.out.println(9/0);catch(Exception ex)System.out.println(“错误:“+ex.getMessage( );System.out.println(“程序继续进行!“);,有异常处理的实例,12.1 异常与异常类 异常的分类,异常是一个对象,这个异常对象必须是某个异常类的实例,这个异常类必须是已经定义好的。如果访问一个没有定义
4、的对象或只定义而没有实例化的对象,则产生异常。 在Java类库的每个类包中都定义了异常类,所有的异常都直接或间接从Throwable类继承。,Throwable类有两个直接子类:Error类及Exception类,后者是Java程序中需要大量处理的。Error类描述的是内部系统错误,包括动态链接失败、虚拟机错误等,Java程序不做处理。Exception类描述的是程序和外部环境引起的错误,这些错误能通过程序捕获和处理。 Runtime Exception类是Exception 类的子类,用来描述编程错误。如被0除等系统错误、数组下标超范围等。它一般由系统检测, 用户可不做处理,系统将它们交给缺
5、省的异常处理程序。,12.1 异常与异常类 异常的分类,常用的Runtime Exception类的子类,1)算术异常ArithmeticException 该异常类型在进行数学运算过程中,由于除法运算中的除数为0,则产生算术异常。 2)数组越界异常IndexOutOfBandsException 该异常用于在数组等数据元素有一定范围的数据存储结构中,当数组存储超过指定界限时产生。 3)类型转换异常ClassCastException 该类异常时由于在变量类型转换过程中,被转换变量无法转换为指定类型的变量所导致。,4)未找到类定义异常NoClassDefFoundException 如果Jav
6、a程序在编译过程中,根据Java源程序指定的包路径没有发现指定的类,则抛出该异常。 5)安全异常SecurityException 当Java系统检测到违反安全的行为,则抛出该异常。 6)空指针异常NullPointerException 除了Java类库所定义的异常类之外,用户也可以通过继承已有的异常类来定义自己的异常类,并在程序中使用。,每种异常类对应着某一种或者一类错误,类中可以包含该运行的错误信息和处理错误的方法等内容。因此,每当程序运行过程中发生一个可识别的错误,即这个错误有一个异常类与之对应,系统就会产生这个异常类的一个对象,把当前的进程停止,并将这个异常抛出,然后接收机制来接收这
7、个异常,由它来处理以后的事情。,12.2 异常处理,Java的异常处理是基于三种操作:声明异常、抛出异常和捕获异常。需要强调的是:对于非运行时异常,程序中必须要作处理,或者捕获,或者声明抛弃;而对于运行时异常,程序中则可不处理。,12.2.1声明异常,一个方法不处理它产生的异常,而是事先说明它可能遇到的异常类型,简单的告诉编译程序哪里可能出错,以便出现异常时,沿着调用层次向上传递,由调用它的方法来处理这些异常,这就叫声明异常。,回忆一下方法定义的完整形式,方法修饰字 返回类型 方法名称(参数列表) throws 异常列表 方法体; throws就是声明异常的关键字。,举例,public voi
8、d myMethod( ) throws IOException 关键字throws指出方法myMethod有可能抛出异常IOExeception。如果方法可能抛出多个异常,可以在关键字throws后添加异常名列表,异常之间用逗号分隔。,12.2.2 抛出异常,在一个方法的运行过程中,如果一个语句引起了错误时,含有这个语句的方法就会创建一个包含有关异常信息的异常对象,并将它传递给系统。我们把生成异常对象并把它提交给运行时系统的过程称为抛出异常。,在声明了异常的方法中,如果出现异常,就可以抛出异常对象。抛出异常对象的语法如下,Throw new 异常类名; 或 异常类名 对象名 new异常类名;
9、 throw对象名; 例如下面语句就抛出了一个IOException异常: throw new IOException; 一个方法只能抛出在方法声明中已经声明的异常的实例,或者异常Error、RuntimeException和它们的子类的实例。,12.2.3 捕获异常,一个方法抛出异常后,Java运行系统从生成异常的方法开始进行回溯,寻找用来处理错误的代码,如果未发现合适的处理错误的代码,程序就会中止。这个寻找处理错误的代码的过程称为捕获异常。 在Java中,当调用一个显示声明异常的方法时,必须通过try-catch-finally语句来捕获一个或多个异常。,该语句的基本格式为:,try 可能
10、产生异常的代码; /不能有其它语句分隔 catch(异常类名 异常对象名) 异常处理代码; /要处理的第一种异常 catch(异常类名 异常对象名) 异常处理代码; /要处理的第二种异常 finally 最终处理(缺省处理) ,1.try语句,捕获异常的第一步,就是将程序设计人员判断可能出现异常的代码放入try关键字后的花括号中。在执行过程中,这段代码可能会产生并抛出一个或多个异常,异常可以由try代码段中的语句抛出,也可以从被try代码段调用的方法中抛出。异常抛出点后的代码在抛出异常后不再执行,也可以说异常的抛出终止了代码段的执行。,2. catch语句,每个try语句必须伴随一个或多个ca
11、tch语句,用于捕获try代码块所产生的异常并做相应的处理。catch语句有一个形式参数,参数类型用于指明其所能捕获的异常类型,运行时,系统通过参数值把被抛出的异常对象传递给catch语句。,3.finally语句,捕获异常的最后一步,是通过finally语句为异常处理提供一个统一的出口。无论try所指定的程序块中是否抛出异常、抛出哪种异常,finally关键字中包含的代码都要被执行。因而,通常在finally语句中可以进行资源的清除工作,如关闭打开的文件、删除临时文件等。 但是,在finally代码段中应该把可能产生异常的语句用try-catch保护起来,以防防止在finally代码段中抛出
12、异常。值得注意的是,在异常处理中,finally语句并不是必需的。,实例演示: 除法运算中,如果除数为0则会引发ArithmeticException异常。本例通过对这类异常进行处理,演示如何声明异常、抛出异常和捕获异常。,算法分析: (1)定义Rational类中,在该类中定义了进行整数除法运算的divide方法,如果用户用零分母调用divide方法,该方法就抛出一个零分母异常。 (2)定义TestThrows类,在该类中将Rational类实例化成两个对象,以演示除数为0和除数不为0时程序运行的不同结果。,实例 TestThrows.java,12.3 创建用户自己的异常,Java类库中提
13、供了多种多样的异常类,它们主要用来处理应用程序中一些常见的运行错误,这些错误系统可以预见的。而在程序设计过程中,有可能出现系统识别不了的运行错误,这时需要用户自己创建自定义异常类来进行处理。 自定义异常类必须是Throwable类的直接或间接子类。因为Error类通常被用来表示系统内部的严重故障,所以一般不把自定义异常类作为Error类的子类。而建议把自定义类作为Exception的子类。,自定义异常的形式如下,class 自定义异常类名 extends 父类名 异常类体; 父类可以是Exception类、Exception类的子类和用户已定义的异常类。 自定义异常类同样要用try-catch
14、-finally捕获,但必须由用户自己抛出。,程序实例演示,例4. 5本例中,通过对银行取钱业务中可能出现的取钱数大于余额而引发的异常的处理,演示自定义异常、声明异常、抛出异常和捕获异常的具体运用。在定义Account类时,将由取钱数大于余额而引发的异常命名为InsufficientFundsException。,算法分析,(1)本例是一个创建了处理存取款业务的程序。 (2)对每一次业务,都显示办理状况的信息:成功或失败,失败(即引发异常)时报告失败原因。 (3)首先,要确定异常只可能产生于取钱方法withdrawal中,处理异常安排在调用的时候,因此withdrawal方法要声明异常,由上级方法捕获并处理。 (4)其次,产生异常的条件是余额少于取额,因此是否抛出异常要先判断该条件。最后,要定义好自己的异常。,实例 TestExceptionDemo.java,课后作业,1习题4的填空题 2习题4的选择题 3. 习题4的程序阅读题,下课!,