Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章

上传人:w****i 文档编号:94520207 上传时间:2019-08-08 格式:PPT 页数:38 大小:977KB
返回 下载 相关 举报
Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章_第1页
第1页 / 共38页
Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章_第2页
第2页 / 共38页
Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章_第3页
第3页 / 共38页
Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章_第4页
第4页 / 共38页
Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章》由会员分享,可在线阅读,更多相关《Java程序案例教程 教学课件 ppt 作者 高职 田智 第6-13章_第7章(38页珍藏版)》请在金锄头文库上搜索。

1、第7章 异常处理,7.1 异常的基本概念 7.2 异常类的继承架构 7.3 抛出异常 7.4 编写自己的异常类,7.1 异常的基本概念 异常也称为例外,是在程序运行过程中发生的、会打断程序正常执行的事件。下面是几种常见的异常: (1) 算术异常(Arithmetic Exception)。 (2) 没有给对象开辟内存空间时会出现空指针异常(Null Pointer Exception)。 (3) 找不到文件异常(File Not Found Exception)。 所以在程序设计时,必须考虑到可能发生的异常事件,并做出相应的处理,这样才能保证程序的正常运行。,7.1.1 异常处理的目的 在没有

2、异常处理的语言中,必须使用if或switch等语句,配合所设想得到的错误状况来捕捉程序中所有可能发生的错误。但为了捕捉这些错误,编写出来的程序代码中经常有很多if语句,有时即使这样也未必能捕捉到所有的错误,而且这样做势必导致程序运行效率的降低。 Java的异常处理机制恰好改进了这一点,它具有易于使用,可自行定义异常类,处理抛出异常的同时不会降低程序的运行速度等优点。因而在Java程序设计时,应充分地利用Java的异常处理机制,以增进程序的稳定性,提高效率。,7.1.2 简单的异常范例 Java本身已有相当好的机制来处理异常的发生。本节主要介绍Java是如何处理异常的。下例TestExcepti

3、on7_1是一个错误的程序,它在访问数组时,下标值已超过了数组下标所容许的最大值,因此会有异常发生。 【例7-1】 TestException7_1.java。,在编译时程序不会发生任何错误,但是在执行到第6行时会产生下列错误信息: Exception in thread “main“ java.lang.ArrayIndexOutOfBounds Exception: 10 at TestException7_1.main(TestException7_1.java:6) 错误的原因在于数组的下标值超出了最大允许的范围。Java发现这个错误之后,便由系统抛出“ArrayIndexOutOf

4、BoundsException”这个种类的异常,用来表示错误的原因,并停止运行程序。如果没有编写相应的处理异常的程序代码,则Java的默认异常处理机制会先抛出异常,然后停止程序运行。,7.1.3 发生异常时的处理 TestException7_1的异常发生后,Java便把这个异常抛了出来,可是抛出来之后没有程序代码去捕捉它,所以程序到第6行便结束,程序根本不会执行到第7行。如果加上捕捉异常的程序代码,则可针对不同的异常做妥善的处理。这种处理的方式称为异常处理。 异常处理是由try、catch与finally三个关键字所组成的程序块,其语法如下:,上述语法是依据下列的顺序来处理异常的: (1)

5、try程序块若有异常发生,则程序的运行便中断,并抛出“异常类所产生的对象”。 (2) 抛出的对象如果属于catch括号内欲捕捉的异常类,则catch会捕捉此异常,然后进到catch的块中继续运行。 (3) 无论try程序块是否捕捉到异常,或者捕捉到的异常是否与catch括号中的异常相同,最后一定都会运行finally块中的程序代码。 (4) finally的程序代码块运行结束后,程序再回到try-catch-finally块之后继续执行。,由上述过程可知,异常捕捉过程中做了两个判断:第一个是try程序块是否有异常产生,第二个是产生的异常是否和catch括号内欲捕捉的异常相同。值得一提的是,fi

6、nally块是可以省略的。如果省略了finally块不写,则在catch块运行结束后,程序跳到try-catch块之后继续执行。根据这些基本概念与运行的步骤,可以绘制出如图7-1所示的流程图。 异常处理的语法格式中,“异常类”指由程序抛出的对象所属的类,例如例7-1中出现的“ArrayIndexOutOfBounds Exception”就属于异常类的一种。至于有哪些异常类以及它们之间的继承关系,本书后面小节将做更进一步的探讨。下面的程序代码加入了try与catch,使得程序本身具有捕捉异常与处理异常的能力。,图7-1 异常处理的流程图,输出结果: 数组超出绑定范围! 这里一定会被执行! ma

7、in()方法结束! 程序说明: (1) 第7行声明一个名为arr的整型数组,并开辟了5个数据空间。 (2) 第8行为数组中的第10个元素赋值,此时已经超出了该数组本身的范围,所以会出现异常。发生异常之后,程序语句转到catch语句中去处理,程序通过finally代码块统一结束。,(3) 第59行的try块用来检查是否有异常发生。若有异常发生, 且抛出的异常属于ArrayIndexOutOfBoundsException类,则运行第1013行的代码块。因为第8行所抛出的异常正是ArrayIndexOutOfBoundsException类,所以第12行会输出“数组超出绑定范围!”字符串。由本例可

8、看出,通过异常机制,即使程序运行时发生问题,只要能捕捉到异常,程序便能顺利地运行到最后,且还能适时地加入对错误信息的提示。 (4) 第10行如果捕捉到了异常,则在catch括号内的异常类ArrayIndexOutOfBounds Exception之后生成一个对象e,利用此对象可以得到异常的相关信息。下例说明了类对象e的应用。,例7-3省略了finally块,但程序依然可以运行。在第10行中,把catch后括号内的内容想象成方法的参数,而e就是ArrayIndexOutOfBoundsException类的对象。对象e接收到由异常类所产生的对象之后,就进到第11行,输出“数组超出绑定范围!”这

9、一字符串,而第12行则输出异常所属的种类,也就是java.lang.ArrayIndexOutOfBoundsException。java.lang正是ArrayIndexOutOfBoundsException类所属的包。 7.1.4 异常处理的方法 当异常发生时,通常可以用两种方法来处理:一种是交由Java默认的异常处理机制进行处理。采用这种处理方式时,Java通常只能输出异常信息,接着便终止程序的运行。例如,TestException7_1的异常发生后,Java默认的异常处理机制会显示:,Exception in thread “main“ java.lang.ArrayIndexOut

10、OfBounds Exception: 10 at TestException7_1.main(TestException7_1.java:6) 接着结束TestException7_1的运行。 另一种处理方式是自行编写try-catch-finally 块来捕捉异常,如TestException7_2与TestException7_3。自行编写程序代码来捕捉异常最大的好处是:可以灵活操控程序的流程,且可做出最适当的处理。图7-2绘出了异常处理机制的选择流程。,图7-2 异常处理的方法,7.2 异常类的继承架构 异常可分为两大类:java.lang.Exception类与java.lang.E

11、rror类。这两个类均继承自java.lang.Throwable类。图7-3为Throwable类的继承关系图。从图中可以看出,Java异常事件分为两大类:一大类继承Error类,另一大类继承Exception类。,图7-3 Throwable 类的继承关系图,习惯上将Error与Exception类统称为异常类,但这两者本质上还是有所不同的。Error类专门用来处理严重影响程序运行的错误,可是通常程序设计者不会设计程序代码去捕捉这种错误,其原因在于即使捕捉到它,也无法给予适当的处理,如Java虚拟机出错就属于一种Error。不同于Error类,Exception类包含了一般性异常,这些异常

12、通常在捕捉到之后便可做妥善的处理,以确保程序继续运行,如Test Exception7_2中所捕捉到的ArrayIndexOutOfBounds Exception就属于这种异常。,从图7-3所示的异常类的继承关系图中可以看出:Exception类扩展出数个子类,其中IOException、Runtime Exception是较常用的两种。RuntimeException即使不编写异常处理的程序代码,依然可以编译成功,而这种异常必须在程序运行时才有可能发生。与RuntimeException不同的是,IOException一定要编写异常处理的程序代码才行,它通常用来处理与输入/输出相关的操作,

13、如文件的访问、网络的连接等。当异常发生时,发生异常的语句代码会抛出一个异常类的实例化对象,之后此对象与catch语句中类的类型进行匹配,然后在相应的catch中进行处理。,7.3 抛 出 异 常 前两节介绍了try-catch-finally程序块的编写方法,本节将介绍如何抛出(throw)异常,以及如何由try-catch来接收所抛出的异常。抛出异常有下列两种方式: (1) 在程序中抛出异常。 (2) 指定方法抛出异常。,7.3.1 在程序中抛出异常 在程序中抛出异常时,一定要用到throw这个关键字,其语法如下: throw异常类实例对象; 从上述格式中可以看出,在throw后面抛出的是一

14、个异常类的实例对象。 【例7-4】 TestException7_4.java。,程序说明: (1) 该程序是要计算a/b的值。因b是除数,故不能为0。若b为0,则系统会抛出ArithmeticException异常,代表除到0这个数。 (2) 在try块中,利用第8行来判断除数b是否为0。如果b=0,则运行第9行的throw语句,抛出ArithmeticException异常;如果b不为0,则输出a/b的值。在此例中强制把b设为 0,因此try块的第9行会抛出异常,并由第13行的catch捕捉到异常。 (3) 抛出异常时,throw关键字所抛出的是异常类的实例对象,因此第9行的throw语句

15、必须使用new关键字来产生对象。,7.3.2 指定方法抛出异常 如果方法内的程序代码可能会发生异常,且方法内又没有使用任何代码块来捕捉这些异常,则必须在声明方法时一并指明所有可能发生的异常,以便让调用此方法的程序得以做好准备来捕捉异常。也就是说,如果方法会抛出异常,则可将处理此异常的try-catch-finally块写在调用此方法的程序代码内。如果要由方法抛出异常,则方法必须采用下面的语法来声明: 方法名称(参数) throws 异常类 1,异常类 2, 下例指定由方法来抛出异常,注意此处把main()方法与add()方法编写在同一个类内。,程序说明: (1) 第110行声明一个Test类,

16、此类中有一个add(int a, int b)方法,但在此方法后用throws关键字抛出一个Exception异常。 (2) 第15行实例化一个Test对象t。 (3) 在第16行调用Test类中的add()方法。 从上面的编译结果可以看出,如果在类的方法中用throws抛出一个异常,则在调用它的地方就必须明确地用try-catch来捕捉。,7.4 编写自己的异常类 Java可通过继承的方式编写自己的异常类。因为所有可处理的异常类均继承自Exception类,所以自定义异常类也必须继承这个类。自己编写异常类的语法格式如下: 可以在自定义异常类中编写方法来处理相关的事件,甚至不编写任何语句也可正常地工作,这是因为父类Exception已提供了相当丰富的方法,通过继承,子类均可使用它们。,程序说明: (1) 第18行声明一个DefaultException 类,此类继承自 Excepti

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号