Java程序设计基础 课件 第8章 异常处理_第1页
Java程序设计基础 课件 第8章 异常处理_第2页
Java程序设计基础 课件 第8章 异常处理_第3页
Java程序设计基础 课件 第8章 异常处理_第4页
Java程序设计基础 课件 第8章 异常处理_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章异常处理8.1异常处理基础8.2异常处理语法8.3自定义异常类本章小结

8.1异常处理基础

所谓异常,就是程序运行时可能出现的一些不正常、错误的情况。例如,试图打开一个根本不存在的文件、类型转换失败、数据库连接异常等,异常处理机制将会改变程序的控制流程,让程序有机会对错误做出处理。没有异常处理机制的编程语言,对程序可能出现的异常情况,往往是用很多if-else的分支语句来尽可能地预知可能发生的情况,保证程序的容错性。但是由于我们需要预测的可能性太多,代码将会剧增,程序将变得复杂。

如图8-1所示是Java异常类的层次结构。

图8-1Java异常层次图

在这个异常类层次最上层的是Throwable,它是java.Lang包中的一个类,该类的名字类似接口名,但实际是一个Java类。Throwable类是Java语言中所有错误或异常的超类,该类派生了两个子类java.lang.Error和java.lang.Exception。图中最底层的三项分别说明如下。

(1) RuntimeException(运行时异常)。运行时异常是程序运行时自动对某些错误做出反应而产生的,所以对于运行时异常不需要编写异常处理的程序代码,依然可以成功编译,主要包括算术异常类、空指针异常类、下标越界异常类、数组元素个数为负异常类、类型强制转换异常类、无效参数异常类等等。这类异常应通过检查程序和程序调试来尽量避免,而不是使用try-catch-finally语句捕获处理,比如a/b,其中的b有可能为0,但是这样的表达式是不需要进行异常处理的。

(2)其它异常类。其它异常类指的是在Exception类下除了RuntimeException之外的异常类,可以称之为受检类异常(CheckedException)。这种异常经常是在程序运行过程中由环境原因造成的,如输入/输出I/O异常、网络地址不能打开、文件未找到等,对于受检类异常必须在程序中使用try-catch-finally语句捕获并进行相应的处理,否则不能通过编译。这是语法上的强制要求,主要在Java的输入/输出程序中比较常见。

(3)各种Error子类。各种Error子类是由系统保留的异常类,该类定义了那些应用程序通常无法捕捉到的错误,一旦此类错误发生,程序就停止运行。该类主要包括内存溢出错误类、栈溢出错误类、类定义未找到错误类、图形界面错误类等。

各种Error子类主要包括OutOfMemoryError、StackOverflowError、NoClassDefFoundError、java.awt.AWTError等。

从上面的描述来看,Java的异常主要有三类:

(1)程序不能处理的错误Error;

(2)程序应避免而可以不去捕获的运行时异常RuntimeException;

(3)必须捕获的非运行时异常CheckedException。

8.2异常处理语法8.2.1try-catch-finally如果程序运行过程中发生了异常,系统会捕获抛出的异常对象并输出相应的信息,同时终止程序的运行,导致其后的程序无法运行。这可能并不是用户所期望的,用户可能更希望由程序来获取和处理异常对象,其它的程序语句则能够继续运行,这就是捕获异常的主要作用,也就是说,对可能发生受检类异常的语句进行监控,被监控的语句一旦发生异常,由异常处理机制来接管程序,并让后续的程序可以继续运行。

try-catch-finally异常处理语法的格式为

说明:

(1) try块:监控区主要是对可能发生受检类异常CheckedException的程序语句段使用try进行包围,而对于可能发生Error或者RuntimeException的语句一般不进行监控。

(2) catch块:如果程序需要在catch块中访问异常对象的相关信息,可以通过catch后异常形参来获得,然后在后面的语句块中进行处理。在一个try-catch-finally的结构中,try块只有一个,而catch块可以有多个,表示能对监控区中的语句进行监控,可以捕捉多个可能发生的异常。

(3) finally块:不管监控区是否发生异常,异常被抛出是否被捕捉到,在try-catch-finally结构的运行流程中如果有finally块,就一定要执行finally块中的语句。finally块是可以被省略的,它常常被用来回收一些物理资源,如数据库连接、网络连接、磁盘文件等。

Java异常处理机制如图8-2所示。

图8-2Java异常处理机制

如果没有异常处理机制,会如何?

(1)异常一旦发生,整个程序就会在发生异常的地方终止运行。

(2)如果没有异常处理机制,可以使用if-else的结构来处理可能发生的异常,从图8-2也可以看出异常处理机制类似于分支结构(注:多分支对应了异常处理可以有多个catch语句)。

多个分支结构,类似于try-catch-finally中的多个catch结构。如果有多个catch语句,要注意catch的排列顺序,如果父类的异常类放在前面,子类放在后面,按照向上转型的观点,子类catch就不能捕捉到相应的异常对象,因为父类在前面对异常对象的捕获进行了“拦截”(只要有一个catch捕捉到异常对象,后面的catch结构就不再执行,这个与多分支结构if-elseif是逻辑一致的)。有不少“偷懒”的程序员,在监控区后面就只写一个catch(Exceptionex),表示对所有的异常类进行捕获,这样也满足了异常处理的语法要求。

当try块一旦发生异常,系统就会生成对应的异常类对象然后抛出,而异常处理机制就会依次使用后面的catch语句来进行捕捉;一旦捕获该异常对象,会将该异常对象赋给catch块后的异常引用变量,程序就可以通过该引用变量来获取该异常的相关信息,并进行相应的处理。下面通过一个程序示例来进行说明。

程序结果:

程序结果:

8.2.2throw/throws

当异常发生时,系统会将相对应的异常类对象生成并抛出。如果是Java定义好的运行时异常或者错误,都由系统自动抛出;如果想在程序中主动抛出异常或者声明函数要抛出异常,可以使用throw或者throws。

1.throw

如果在一个方法内部需要主动抛出异常对象,可以使用throw(第一人称)进行异常抛出,其语法为

throw异常类对象;

程序结果:

2.throws

如果是在一个方法的头部声明该方法可能要抛出异常,可以使用throws来完成(第三人称单数加s),其语法为

使用throws声明抛出异常的一般情况是:当前方法不知道如何(或者不想)处理方法中可能发生的异常,于是不使用try-catch监控和捕捉异常,而是在方法声明中说明该方法将有可能抛出异常,由方法的上一级调用者处理,自己不再处理。

函数嵌套调用可能会使得异常一层层向上抛出,最后会抛出到main方法。如果main方法也不进行处理,继续使用throws声明抛出异常,而该异常就会抛出到控制台上显示异常的栈轨迹信息,并中止程序运行。

当一个方法在头部声明抛出异常后,如果为受检类异常,则该方法被调用的时候就必须用try-catch-finally结构对该方法监控并进行异常处理或者继续声明向上抛出,如下列程序所示。

8.3自定义异常类

用户自定义异常都应该继承Exception类,如果希望自定义运行时异常,则应该继承RuntimeException类。定义异常类时通常需要提供两种构造函数:一是无参数的构造函数;二是带一个字符串的构造函数,这个字符串将作为该异常对象的详细说明(也就是异常对象的getMessage方法的返回值)。

由于Exception类中具有以下方法,所以自定义异常类也继承了这几个方法:

(1) getMessage():返回该异常的详细描述字符串。

(2) printStackTrace():将该异常的跟踪栈轨迹输出到标准错误输出流。

(3) printStackTrace(PrintStreams):将该异常的跟踪栈信息输出到指定输出流。

(4) getStackTrace():返回该异常的跟踪栈轨迹信息。

只有在软件中自定义异常类,系统才能识别特定的运行错误,才能及时对错误进行控制和处理,这是增强软件稳定性和健壮性的手段之一。用户自定义异常类不能由系统自动抛出,需要在程序中使用throw语句来定义在什么情况下产生异常,并抛出该自定义异常类的对象。例如,对前面的动物类做一个自定义异常类,如果动物重量为负数(在生成动物类对象或者对动物类的weight进行设置时进行判定),则抛出自定义异常对象。

程序结果:

本章小结

1.按照是否必须进行异常处理,异常类可分为两大类:java.lang.Error类+ RuntimeException类和受检异常类。前面一类是不需要进行异常处理的,在Exception下除了RuntimeException之外的所有类称为受检异常类,该类是必须进行异常处理的。2.如果没有异常处理机制,一旦发生异常,系统将抛出异常,并终止程序运行。

3.Java的异常处理主要有下列两种方式:

(1)使用try-catch-finally结构,即使用try块来监控可能发生异常的程序段,使用catch块来捕捉抛出的异常并进行处理;catch块可以有多个,无论有否异常发生,是否捕捉到,都要执行finally块语句。该结构类似于if-elseif结构。

(2)如果一个方法对方法内部的语句不想进行异常处理,可以使用throws在函数头部进行异常抛出声

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论