《第7章 异常精选文档.ppt》由会员分享,可在线阅读,更多相关《第7章 异常精选文档.ppt(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、本讲稿第一页,共二十四页Java EEJava EE基础教程基础教程23 九月 20222 异常是程序运行过程中产生的错误。比如在进行除法运算时,如果除数为0,则运行时Java会自动抛出一个算术异常,它会中断程序的正常运行,如果不对它进行处理,有时会产生严重的后果。例如:在转账过程中,将钱从一个账户转到另一个账户时,如果钱已经从一个账户转出,在转到另一个账户的过程中出现异常,程序被迫中止。此时,用户就会损失这笔钱。本讲稿第二页,共二十四页Java EEJava EE基础教程基础教程23 九月 202237.1 异常的处理机制异常的处理机制7.1 7.1 异常的处理机制异常的处理机制 在在Jav
2、aJava语言中,通过异常处理机制为程序提供错误处理的能力。语言中,通过异常处理机制为程序提供错误处理的能力。根据这个处理机制,对程序运行时可能遇到的异常情况,预先提供一些处理的方法。根据这个处理机制,对程序运行时可能遇到的异常情况,预先提供一些处理的方法。在程序执行代码的时候,一旦发生异常,程序会根据预定的处理方法对异常进行处在程序执行代码的时候,一旦发生异常,程序会根据预定的处理方法对异常进行处理,异常处理完毕后,程序继续运行。理,异常处理完毕后,程序继续运行。Java Java异常处理机制通过异常处理机制通过5 5个关键字进行控制:个关键字进行控制:trytry、catchcatch、t
3、hrowthrow、throwsthrows和和finallyfinally。下面阐述系统如何通过这。下面阐述系统如何通过这5 5个关键字对异常进行处理。程序将必须监控个关键字对异常进行处理。程序将必须监控异常的语句包含在异常的语句包含在trytry块中。如果在块中。如果在trytry块中发生异常,程序将引发一个异常,块中发生异常,程序将引发一个异常,通过使用通过使用catchcatch关键字,系统捕获异常,并将处理该异常的代码写在关键字,系统捕获异常,并将处理该异常的代码写在catchcatch块中。在块中。在finallyfinally块中,可以指定在程序结束之前必须执行的代码,无论异常是
4、否发生,这段代块中,可以指定在程序结束之前必须执行的代码,无论异常是否发生,这段代码一定会被执行。异常的引发可以有自动和手动两种方法,如果需要手动产生异常,可码一定会被执行。异常的引发可以有自动和手动两种方法,如果需要手动产生异常,可以通过使用以通过使用throwthrow关键字来实现。关键字来实现。throwsthrows关键字出现在方法的声明中,标识调用关键字出现在方法的声明中,标识调用该方法可能抛出的各种异常。该方法可能抛出的各种异常。返回本讲稿第三页,共二十四页Java EEJava EE基础教程基础教程23 九月 20224 7.2.1 Java内置异常 为了处理一些常见的异常,Ja
5、va语言中提供了一些内置的异常类供我们使用。这些类都继承自java.lang.Throwable类,而Throwable类又继承自Object类。Throwable类有两个重要的子类:Error类和Exception类。它们分别用来处理两种类型的异常。Error类及其子类通常用来描述Java运行时的内部错误,比如:在读取磁盘上的文件时,磁盘的扇区出现了损坏;从软盘中读取文件数据时,软驱中没有放入软盘。Error类又称为致命异常类,该类表示的异常是比较严重的异常,一旦发生该类型的异常,通过修改程序代码是不能恢复程序的正常运行的。在一般情况下,发生该异常后,程序应该马上终止。7.2 异常的处理异常
6、的处理返回本讲稿第四页,共二十四页Java EEJava EE基础教程基础教程23 九月 20225Exception类及其子类代表另一种类型的异常。该类用于用户程序可以捕获的异常情况。通过捕获和处理产生的异常,可以恢复程序的正常运行。该类有一个重要的子类RuntimeException,又称为运行时异常。在程序中出现除数为0的运算、数组下标越界等情况时,都会引发该类型的异常。本讲稿第五页,共二十四页Java EEJava EE基础教程基础教程23 九月 20226 Java语言中规定:只有Throwable、Error、Exception类及其派生类的实例,Java运行时系统才将它识别为系统
7、异常。表7-1中列出了一些常用的异常类及其用途。下面简单介绍常见的异常类,其他异常类将在后面的章节中陆续介绍。1)ArithmeticException类该类用于描述算术异常,比如当除数为0时,会抛出该异常。int result=8/0;/除数为0,抛出ArithmeticException异常2)NullPointerException类用来描述空指针异常,当引用的对象是null时,如果试图通过“.”操作符访问该对象的成员时,会抛出该异常。String str=null;int len=str.length();/因为str为null对象,不能调用它的length()方法。本讲稿第六页,共二
8、十四页Java EEJava EE基础教程基础教程23 九月 202273)ArrayIndexOutOfBoundException类 该类用来描述数组下标越界时出现的异常。float arr=new float4;arr4=9;/数组的最大下标是3,而此处的4超过了该值4)NubmerFormatException类 该类用于描述字符串转换为数字时的异常。String str=”23U”;double d=Double.parseDouble(str);/“23U”不能转换为double类型的数 本讲稿第七页,共二十四页Java EEJava EE基础教程基础教程23 九月 202287.
9、2.2 try和catch语句 在Java语言中,对容易引发异常的代码,可通过trycatch语句捕获。在try语句块中编写可能引发异常的代码,然后在catch语句块中捕获这些异常,并进行相应的处理。trycatch语句块的语法格式如下:try可能产生异常的代码catch(异常类1 异常对象1)异常处理代码段1catch(异常类2 异常对象2)异常处理代码段2catch(异常类n 异常对象n)异常处理代码段n 本讲稿第八页,共二十四页Java EEJava EE基础教程基础教程23 九月 20229try语句块中的代码执行后可能同时产生多种异常,程序捕获哪一种类型的异常,是由catch语句中的
10、“异常类”参数指定。catch语句类似于方法的声明,包含一个异常类型和该类型的一个对象,通过在catch块中调用该对象的方法可以获取该异常的详细信息。代码中的每个catch语句块都用来捕获一种类型的异常。如果try语句块中的代码执行时发生异常,则会由上而下依次查找能捕获该异常的catch语句块,并执行该catch语句块中的代码。本讲稿第九页,共二十四页Java EEJava EE基础教程基础教程23 九月 202210 例7-1 根据输入的总分和人数,计算平均成绩程序清单:ch07ComputeAvg.javaimport java.util.InputMismatchException;im
11、port java.util.Scanner;public class ComputeAvg public static void main(String args)int score,num;double avg;Scanner in=new Scanner(System.in);trySystem.out.println(请输入总分:);score=in.nextInt();/ASystem.out.println(请输入人数:);num=in.nextInt();/Bavg=score/num;/CSystem.out.println(平均成绩为:+avg);catch(InputMis
12、matchException e1)System.out.println(输入不是数字!);catch(ArithmeticException e2)System.out.println(人数不能为0);catch(Exception e3)System.out.println(其他异常:);本讲稿第十页,共二十四页Java EEJava EE基础教程基础教程23 九月 202211以上介绍了如何使用trycatch结构实现异常处理。在使用该结构时,还必须注意以下几点:1)catch块一定要与try块一起使用,不能够单独使用catch块。2)一个try块可以有多个catch块。但是,多个cat
13、ch块的排列顺序必须是从特殊到一般,最后一个一般是Exception类。3)如果不发生异常,catch块永远不会被执行。4)一旦某个catch块被执行后,其他catch块都会被忽略。5)trycatch结构可以嵌套使用本讲稿第十一页,共二十四页Java EEJava EE基础教程基础教程23 九月 2022127.2.3 throw语句 前面介绍了如何获取并处理被Java运行时系统抛出的异常。那么,用户可以显式地在程序中手动引发异常吗?答案是可以的,通过使用Java异常处理机制提供的throw关键字主动地抛出异常。throw语句的语法结构如下:throw 异常类的实例程序 在执行到throw语
14、句时,首先检查它所在层的try块,是否有一个catch子句与该实例的类型匹配。如果找到匹配的,则程序的控制权转移到该语句块。如果没有找到匹配的,再检查上一层的catch语句块,直到执行到最外层的catch块。如果一直找不到相应的异常处理代码,则程序的控制权将交还给系统,程序将停止运行。本讲稿第十二页,共二十四页Java EEJava EE基础教程基础教程23 九月 202213例7-2 定义一个方法check(),检查输入的商品数是否大于0,如果小于0就抛出异常。然后在主函数中调用该方法。程序清单:ch07checkDemo.javaimport java.util.Scanner;publi
15、c class checkDemo public static void check()Scanner in=new Scanner(System.in);System.out.println(请输入商品的书目:);int num=in.nextInt();if(num0)throw new NumberFormatException(商品书目不能小于0!);elseSystem.out.println(商品数目为:+num);本讲稿第十三页,共二十四页Java EEJava EE基础教程基础教程23 九月 202214public static void main(String args)t
16、ry check();catch(Exception e)System.out.println(异常:+e.getMessage();程序的运行结果如下。请输入商品的书目:-3异常:商品书目不能小于0!本讲稿第十四页,共二十四页Java EEJava EE基础教程基础教程23 九月 202215 7.2.4 throws语句 若某个方法可能会产生异常,但不想在当前方法中处理该异常,那么可以将该异常抛出,然后在调用该方法的代码中捕获并处理该异常。为了实现该功能,可以使用Java语言提供的throws关键字实现该功能。throws关键字写在方法声明的后面,用来指定该方法可能抛出的异常,多个异常之间
17、用逗号隔开。例7-3 定义一个方法test(),该方法可能抛出两种类型的异常,然后在主函数中调用该方法,并处理可能出现的这些异常。本讲稿第十五页,共二十四页Java EEJava EE基础教程基础教程23 九月 202216程序清单:ch07throwsDemo.javaimport java.io.IOException;import java.util.Scanner;public class throwsDemo public static void test()throws NullPointerException,IOExceptionSystem.out.println(请输入一个
18、数字(0,1):);Scanner in=new Scanner(System.in);int flag=in.nextInt();if(flag=1)throw new NullPointerException();本讲稿第十六页,共二十四页Java EEJava EE基础教程基础教程23 九月 202217elsethrow new IOException();public static void main(String args)try test();catch(NullPointerException e)System.out.println(系统抛出了+e.getClass()+类型
19、的异常);catch(IOException e)System.out.println(系统抛出了+e.getClass()+类型的异常);程序运行后,如果输入“1”,方法test()抛出了NullPointerException类型的异常,程序的输出结果如下所示:请输入一个数字(0,1):1系统抛出了class java.lang.NullPointerException类型的异常 本讲稿第十七页,共二十四页Java EEJava EE基础教程基础教程23 九月 2022187.2.5 finally语句 在编写异常处理代码时,无论try块中是否有异常抛出,都有一些工作必须在try语句正常结
20、束或者出现异常后进行的,比如对try块中所调用资源的回收工作。finally语句块可以包含一些无论程序是否正常运行都必须执行的一些语句。该子句是可选的,但是每个try语句块应该至少有一个catch语句块或finally语句块。本讲稿第十八页,共二十四页Java EEJava EE基础教程基础教程23 九月 2022197.3 自定义异常自定义异常 通常使用通常使用JavaJava内置的异常类型可以描述在编写程序时出内置的异常类型可以描述在编写程序时出现的大部分异常情况,但根据需要,有时候需要创建自己现的大部分异常情况,但根据需要,有时候需要创建自己的异常类,用来描述编程过程中遇到的一些特殊情况
21、。下的异常类,用来描述编程过程中遇到的一些特殊情况。下面就来介绍一下如何创建和使用自定义的异常类。面就来介绍一下如何创建和使用自定义的异常类。自定义异常类时,它必须派生自自定义异常类时,它必须派生自ThrowableThrowable类及其类及其子类。一般情况下,用户自定义异常类应该继承自子类。一般情况下,用户自定义异常类应该继承自ExceptionException类。这样,可以使用类。这样,可以使用ExceptionException类中的所有方类中的所有方法。在程序中定义和使用自定义异常类,一般可分法。在程序中定义和使用自定义异常类,一般可分为以下几个步骤:为以下几个步骤:返回本讲稿第十
22、九页,共二十四页Java EEJava EE基础教程基础教程23 九月 202220v(1)创建派生自)创建派生自Exception类或其子类的自定义异常类类或其子类的自定义异常类v(2)在方法中通过)在方法中通过throw语句抛出自定义的异常类对象语句抛出自定义的异常类对象v(3)如果在当前抛出异常的方法中处理异常,可以使用)如果在当前抛出异常的方法中处理异常,可以使用trycatchv 语句块捕获并处理该异常;否则在方法声明处通过语句块捕获并处理该异常;否则在方法声明处通过throws语句语句v 指明方法可能抛出的异常。指明方法可能抛出的异常。v(4)在调用由)在调用由throws语句声明
23、的方法时,在调用方法的代码中,语句声明的方法时,在调用方法的代码中,捕获捕获v 并处理自定义的异常类对象。并处理自定义的异常类对象。本讲稿第二十页,共二十四页Java EEJava EE基础教程基础教程23 九月 202221 例7-4 创建一个自定义异常类,个性化处理除数为0的情况。程序清单:ch07ExceptionTest.javaimport java.util.Scanner;class MyException extends Exception/继承Exception类private String myString;public MyException(String myStrin
24、g)this.myString=myString;public String getMyString()return myString;Overridepublic String toString()/重写了类的方法return myString;public class ExceptionTest public static void main(String args)double i,j;Scanner scan=new Scanner(System.in);System.out.println(请输入分子:);i=scan.nextDouble();本讲稿第二十一页,共二十四页Java
25、EEJava EE基础教程基础教程23 九月 202222System.out.println(请输入分母);j=scan.nextDouble();try if(j=0)/判断分母的值 throw new MyException(除数不能零!);/AelseSystem.out.println(分数值为:+i+/+j+=+(i/j);catch(MyException e)System.out.println(e);本讲稿第二十二页,共二十四页Java EEJava EE基础教程基础教程23 九月 202223该程序代码定义了一个继承Exception类的自定义异常类MyException。在这个类中,定义了一个字符串成员,重写了toString()方法,个性化输出自定义的错误信息。然后在测试类中输入了两个数,如果第二个数为0,则在代码行A处抛出带有自定义错误信息的异常对象,然后在catch块中对上述抛出异常。程序的运行结果如下:请输入分子:3请输入分母0除数不能零!本讲稿第二十三页,共二十四页Java EEJava EE基础教程基础教程23 九月 202224The End本讲稿第二十四页,共二十四页