《异常处理机制 》PPT课件.ppt
第7章 异常处理机制,学习目标 本章要点上机练习 习 题,学习目标,编写程序中不可能不出现错误,Java语言把程序运行中可能遇到的错误分为两类:一类是非致命的错误,通过修改后还能继续运行,这种错误就是异常(Exception);另外一类是致命错误,即系统不能恢复,这就是错误(Error)。,学习目标,Java语言使用一种特殊的机制来处理异常,本章将通过具体例子来讲解Java怎样用try-catch-finally语句来实现这种机制,以及怎样使用自定义异常类型来扩充Java系统的异常处理功能。通过本章学习,读者可解决Java编程中遇到的常见问题,使编程过程更加顺畅。,本章要点,异常的概念异常和错误产生原理异常的处理机制如何自定义异常,Java中的异常,异常处理是Java语言中用于处理程序各种错误的一种机制,严谨地处理错误是保证程序效率和质量的关键。本节将详细介绍Java语言中错误的基本概念。异常和错误的产生 异常的层次结构,异常和错误的产生,任何一种计算机语言设计的程序在运行时都可能出现各种错误,常见的错误如除数为0、文件不存在、文件不能打开、数组下标超过界限和内存不够用等。对于这种在运行中出现的错误,计算机系统中通常有两种处理办法。,异常和错误的产生,由计算机系统本身直接检测程序错误,遇到错误时使程序终止运行。这种处理方法的优点是使程序设计比较简单。但是,对程序错误一概地采用终止运行办法,显然过于简单。,异常和错误的产生,由开发人员在程序设计中兼顾错误检测、错误信息显示和出错处理。这种处理方法的优点是减少中途终止程序运行的可能性。但是,要求开发人员在程序设计中不仅将精力用于正常处理过程,还要精心考虑错误检测和处理,这会使程序变得复杂。,异常和错误的产生,并且,这类错误检测往往是多数程序中重复甚至在一个程序中多次重复。而另一方面,如果程序中某处忽略了应有的检测,又将引起程序总体结果的错误。,异常和错误的产生,Java采用异常处理机制来处理程序运行中的错误。按照这种机制,将程序运行中的所有错误都看成一种异常,通过对语句块的检测,一个程序中所有的异常被收集起来放在程序的某一段中去处理。在Java系统中,专门设置了一个调用栈,此栈中装有指向异常处理方法的指针。,异常和错误的产生,在程序运行时,系统会把收集到的异常和异常处理指针所指的处理类型逐个比较,如果找到相符的类型,那么就转向相应的方法处理,如没有在调用栈中找到相应的类型指针,则终止程序运行,并显示解释信息。,异常和错误的产生,在Java程序中,异常一般由以下两种原因引起。,异常和错误的产生,程序中存在非法操作:最简单的例子就是除数为0的除法操作,这常常是开发人员出于无意或大意造成的,称为隐式异常。常见的隐式异常可以通过java.lang包中的Throwable类的子类Error处理。,异常和错误的产生,程序使用throw语句引起的异常:这种异常是开发人员出于某种考虑有意安排的,称为显式异常。,异常和错误的产生,在throw语句中,都会指出处理显式异常的对象,这些对象都是由java.lang包的类Throwable的子类Exception再派生的子类生成的,每个对象完成对某种异常的处理功能,这些对象综合起来实现各种异常处理。,异常和错误的产生,【例7-1】异常的产生(光盘:源文件第7章例7-1.txt)。,异常和错误的产生,该程序抛出一个越界异常。异常处理允许程序捕获异常,处理它们,然后程序继续执行。它是分层把关,因此,错误情况不会介入到程序的正常流程中。当错误情况发生时,错误与正常执行的代码在分离的代码块中被处理,这就更易识别和管理。,异常的层次结构,Java程序中的异常以类的层次结构组织。Throwable是所有异常类的父类,它是Object的直接子类。Exception和Error是Throwable的直接子类,而RuntimeException是Exception的子类。这些异常类是可以检测的。,异常的层次结构,异常的层次结构,在系统包java.lang、java.util、java.io和中声明的异常类是标准异常类。这些标准异常类分为RuntimeException子类和其他Exception的子类两种。,异常的层次结构,RuntimeException子类,因为RuntimeException子类是不可检测的异常类,所以这些标准异常类也是不可检测的异常类。除了RuntimeException子类以外的其他Exception的子类。,异常的层次结构,下面分别介绍这些类。不可检测的标准异常类 可以检测的标准异常类,不可检测的标准异常类,java.langk中不可检测的标准异常类如下所示。ArithmeticException表示遇到异常的算术问题,比如被0整除。,不可检测的标准异常类,ArrayStoreException表示试图把和数组类型不符合的值存入数组。ClassCastException表示试图把一个对象的引用强制转换为不合适的类型。,不可检测的标准异常类,IndexOutOfBound Exception表示下标越界。NullPointerException 表示试图使用一个空的对象引用。Security Exception 表示检测到了违反安全的行为。,不可检测的标准异常类,java.util中不可检测的标准异常类如下所示。EmptyStackException 表示试图访问一个空堆栈中的元素。NoSuchElementException 表示试图访问一个空向量中的元素。,可以检测的标准异常类,java.lang中可检测的标准异常类如下所示。ClassNotFoundException表示具有指定名字的类或接口没有被发现。CloneNotSupportException表示克隆一个没有实现Cloneble接口的类。,可以检测的标准异常类,IllegalAccessException 表示试图用给出了完整的路径信息的字符串加载一个类,但是当前正在执行的方法无法访问指定类,因为该类不是public类型或者放在别的包中。,可以检测的标准异常类,InstantiationException表示试图使用Class的newInstance方法创建一个对象实例,但是指定的对象没有被实例化,因为它是一个接口、抽象类或者另外一个数组。,可以检测的标准异常类,InterruptedException表示当前的线程正在等待,而另一个线程使用了Thread的interrupt方法中断了当前线程。,可以检测的标准异常类,java.io中可检测的标准异常类如下所示。IOException表示申请I/O操作没有正常完成。EOFException表示在输入操作正常结束前遇到了文件结束符。,可以检测的标准异常类,FileNotFoundException表示在文件系统中,没有找到由文件名字符串指定的文件。InterruptIOException表示当前线程正在等待I/O操作完成,而另一个线程使用Thread的interrupt方法中断了当前线程。,异常处理机制,程序运行时如果发生异常,即自动终止运行并输出提示信息,异常处理就是对所发生的异常进行处理,从而避免出现死机或重启机器的现象。其重要性在于程序一方面要能够发现异常,另一方面还要能够捕获异常。,异常处理机制,Java语言提供的异常处理机制,有助于找出异常类型并恢复它们。异常的捕获和抛出 异常处理程序 自定义异常 应用举例抛出异常,异常的捕获和抛出,在Java中采用try-catch-finally来进行异常的监视、捕获和处理,也可以通过throws语句抛出异常。含有异常处理程序的结构如下所示:try./被监视的代码段,一旦发生异常,即抛出给后面的catch语句,异常的捕获和抛出,catch(异常类型 e)./要处理的第一种异常catch(异常类型 e)./要处理的第二种异常finally./最终处理,异常的捕获和抛出,编程人员首先把可能会发生异常情况的代码放在try语句段中,利用try语句对该段代码进行监视。如果发生了异常,则交给下面的catch语句。catch能够正确执行的前提条件是能识别出抛出的异常就是自己能够处理的异常类型。,异常的捕获和抛出,假设catch中声明的异常类和抛出的异常类相同,或者是它的父类,catch就可以捕获任何这种异常类的对象。,异常的捕获和抛出,finally语句中是最终都要处理的代码段,无论try所指定的程序块中抛出或不抛出异常,也无论catch语句的异常类型是否与所抛出的异常的类型一致,finally所指定的代码都要被执行,这是一个统一的出口。通常放置进行资源清除的语句。,异常处理程序,如果异常发生后没有被捕获到,那么流程控制将把异常向下传递。也就是说:如果发生异常的方法1没有处理异常的语句,就把异常传递给调用它的方法2,如果方法2也没有处理,那么就继续传递,直到传递到能够处理它的方法。,异常处理程序,假设到最后还是没有找到可以处理异常的catch语句,那么在finally子句执行完以后,调用ThreadGroup中的uncaughtException方法,终止当前线程。,异常处理程序,如果开发人员希望在异常发生时也能有一段代码可以执行,那么应该使用finally子句。看下面的例子。【例7-2】异常处理程序(光盘:源文件第7章例7-2.txt)。,类“CatchDemo”运行结果,自定义异常,前面讲述了Java中的异常处理机制,现在介绍如何创建自定义异常。一般自定义异常是从Exception类中派生出来的。【例7-3】自定义异常(光盘:源文件第7章例7-3.txt)。,类“catchdemo2”运行结果,应用举例抛出异常,本节将以抛出异常为例进行讲解(光盘:源文件第7章应用举例ExceptionDemo.txt)。,上 机 练 习,本次练习要求编写一个程序,同时捕获数组越界被0除的异常,说明异常处理语句try-catch-finally的处理机制(光盘:源文件第7章上机练习.txt)。,类“TestException”运行结果1,类“TestException”运行结果2,上 机 练 习,分析:如果没有异常处理,直接输出两个数组对应元素相除的结果,会出现什么样的情况,分析其原因。,习 题,试编写一段程序,该程序试图捕获一个异常类为IndexOutOfBoundException的异常,但是发生的异常确是其他类型的情况。,