java面向对象程序设计第08章异常处理课件_第1页
java面向对象程序设计第08章异常处理课件_第2页
java面向对象程序设计第08章异常处理课件_第3页
java面向对象程序设计第08章异常处理课件_第4页
java面向对象程序设计第08章异常处理课件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、 信息类专业课程西北农林科技大学第八章 异常处理第1页,共33页。导读主要内容异常的含义及分类异常处理两种抛出异常的方式自定义异常常见异常难点自定义异常第2页,共33页。1异常的含义所谓异常就是程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等2异常处理的必要性传统错误处理的不足之处,主要表现为:(1)程序复杂;(2)可靠性差;(3)返回信息有限;(4) 返回代码标准化困难。Java语言采用错误代码和异常处理相结合的方式可以把错误代码与常规代码分开,也可以在catch中传播错误信息,还可以对错误类型分组。一、异常的含义及分类第3页,共33页。3异常的分类在java语言中,异常是一个

2、对象,它继承于Throwable类,所有的Throwable类的子孙类所产生的对象都是例外(异常)。从Throwable直接派生出的异常类有 Exception 和 Error,如图6-1所示。一、异常的含义及分类第4页,共33页。图1 Java异常层次图ThrowableErrorExceptionRuntimeExceptionContingencyException一、异常的含义及分类第5页,共33页。Exception 是代表了真正实际意义上的异常对象的根基类。Exception 和从它派生而来的所有异常都是应用程序能够捕获到的,并且可以进行异常错误恢复处理的异常类型。Error 则表

3、示 出现了一个非常严重的异常错误,并且这个错误可能是应用程序所不能恢复的,例如 LinkageError ,或 ThreadDeath 等。由Java虚拟机生成并抛出,Java程序不做处理。java.long.Error和java.lang.RuntimeException的子类免于编译时的检查。RuntimeException异常由系统检测,用户的Java 程序可不做处理,系统将它们交给缺省的异常处理程序。一、异常的含义及分类第6页,共33页。二、异常处理2.1. 异常处理的基本结构2.2. 多个catch 块2.3. finally语句第7页,共33页。2.1 异常处理的基本结构1异常处理

4、的定义异常处理是用户程序以预定的方式响应运行错误和异常的能力。它的基本方式是:当一个方法引发一个异常后,可将异常抛出,由该方法的直接或者间接调用者处理异常。2异常处理语句异常处理语句有try、catch、finally、throw和throws。在以下部分将逐一介绍这些语句的作用。第8页,共33页。3异常处理的基本结构try catch结构是异常处理的基本结构。这种结构中可能引发异常的语句封入在try块中,而处理异常的相应语句封入在catch块中。结构的格式如下:2.1 异常处理的基本结构第9页,共33页。 try 程序执行体 catch(异常类型1 异常对象1) 异常处理程序体1 catch

5、(异常类型2 异常对象2) 异常处理程序体2 catch(异常类型n 异常对象n) 异常处理程序体nfinally 异常处理结束前的执行程序体/不论发生什么异常(或者不发生任何异常),都要执行的部分;2.1 异常处理的基本结构第10页,共33页。说明:(1) try语句指明可能产生异常的代码段;(2) catch语句在try语句之后,用于捕捉异常,一个try语句可以有多 个catch语句与之匹配。当有多个catch语句时,系统依照先后顺 序逐个检查 。用catch语句捕捉异常时,若找不到相匹配的catch 语句,将执行缺省的异常处理。(3)将catch程序块的参数不能设置成多个,一个catch

6、只有一个参数.(4)若两个catch程序块(均和某个try程序块有关)都用于捕捉同一类 型异常,那么将产生语法错误。(5)若某一类型异常,可能有几个异常处理程序与他相匹配,那么执行 first相匹配的异常处理程序(6)java中可以使用嵌套的trycatch结构。在使用嵌套的try块时, 将先执行内部try块,如果没有遇到匹配的catch块 则将检查外部 try块的catch块。2.1 异常处理的基本结构第11页,共33页。throw语句 用于指出当前现有异常,当程序执行到throw语句时,流程就转到相匹配的异常处理语句,所在的方法也不再返回值。throw语句可以将异常对象提交给调用者,以进行

7、再次处理。throws语句指明方法中可能要产生的异常类型,由调用者进行异常处理。2.1 异常处理的基本结构第12页,共33页。2.2 多个catch 块单个try块能有许多catch块,当try块有可以引起不同类型异常的语句时,多个catch块是必须的。第13页,共33页。【实例2】public class TryCatchpublic static void main(String args) int a=0,0;int num=1,result=0;try result = num/0;System.out.println(num/a2);catch (ArithmeticExceptio

8、n e) System.out.println(Errore) ; catch (ArrayIndexOutOfBoundsException e)System.out.println(Errore);catch (Exception e)System.out.println(Some other error: );2.2 多个catch 块第14页,共33页。2.3 finally语句finally语句可以和try语句一起使用,无论是否出现异常,finally语句指明的代码一定被执行。一个异常处理程序只有一个finally块,但并不强制必须要有finally块。有时,必需处理某些语句(如文件

9、关闭操作),不管异常是否发生,都必须执行。此时,虽然能够在try和catch块放置代码以结束文件,但是为了避免重写代码,可以把代码放在 finally块。有时候我们希望某些语句在发生异常时也能执行,以释放外部资源或者关闭一个文件,这时可以用finally 语句来实现。第15页,共33页。【实例3】import .*;import java.io.*;class withoutFinallyExample public void foo() throws IOException /在空闲的端口上创建一个套接字 ServerSocket ss = new ServerSocket(0); try

10、Socket socket = ss.accept(); /此处的其他代码. catch (IOException e) ss.close(); /label1 throw e; /. ss.close(); /label2 2.3 finally语句第16页,共33页。【实例3】问题上述代码没有finally块,程序中创建了一个套接字,并调用 accept 方法。在退出该方法之前,必须关闭此套接字,以避免资源漏洞。为此,在/label2处调用 close来关闭此套接字,此语句为该方法的最后一条语句。正常情况下,/label2处的close会执行,但是,如果 try 块中发生一个异常会时,/l

11、abel2处的close语句是不会执行的,即在这种情况下,套接字没有关闭,可能产生资源漏洞。因此,程序中必须捕获这个异常,并在重新发出这个异常之前在 / label 1 处插入对 close 的另一个调用。这样就可以确保在退出该方法之前关闭套接字。但上述编写代码方式既麻烦又易于出错,但在没有 finally 的情况下这是必不可少的。以下借助finally块来解决这个问题。2.3 finally语句第17页,共33页。【实例4】import .*;import java.io.*;class WithFinally public void foo2() throws IOException /在

12、空闲的端口上创建一个套接字 ServerSocket ss = new ServerSocket(0); try Socket socket = ss.accept(); /此处的其他代码. finally ss.close(); 2.3 finally语句第18页,共33页。三、两种抛出异常的方式3.1 throw 直接抛出3.2 throws间接抛出异常(声明异常)第19页,共33页。3.1 throw 直接抛出直接抛出异常是在方法中用关键字throw引发明确的异常。当throw被执行时,其后语句将不再被执行,执行流程将直接寻找catch语句并进行匹配 throw e。显然,这种异常不是出

13、错产生,而是人为地抛出。throw抛出异常的格式为:throw ThrowableObject;例如:throw new ArithmeticException();第20页,共33页。【实例5】class JavaThrow 1public static void main(String args) System.out.print(“Now ”);try System.out.print(“is ”); throw new NullPointerException() ; /直接抛出一个异常 ; /System.out.print(“This will not execute!”); /此

14、句不被执行 catch (NullPointerException m)System.out.print(“the ”); System.out.print(“time. n”); 3.1 throw 直接抛出第21页,共33页。运行结果为:Now is the time.说明:在本实例中,“throw new NullPointerException() ;”用于人为抛出异常NullPointerException,catch (NullPointerException m)块对这类异常进行处理。注意:语句System.out.print(“This will not execute!”);

15、必须注释起来,否则编译时会出现如下错误。3.1 throw 直接抛出第22页,共33页。第23页,共33页。3.2 throws间接抛出异常说明:如果一个方法可能导致一个异常但不处理它,此时要求在方法声明中包含throws子句通知潜在调用者,在发生异常时沿着调用层次向上传递,由调用它的方法来处理这些异常。这类异常成为声明异常。基本格式为:类型 方法名(参量表) throws 异常列表 代码 第24页,共33页。【实例10】class ThrowsExceptionExample1 private static void p() throws ArithmeticException /间接抛出异

16、常,自己并未处理,让方法的直接调用者来处理int i; i=4/0; /此句可能引发异常,可是自己并未处理 public static void main(String args) tryp(); /方法的直接调用者俘获处理异常 catch(ArithmeticException e) System.out.println(“Error: Divider is zero! n”); 3.2 throws间接抛出异常第25页,共33页。【实例6-10】运行结果为:Error: Divider is zero!说明:在本实例中,语句i=4/0;将产生异常,产生异常后方法p()并不作处理,而是由调用

17、p()的方法main做处理。3.2 throws间接抛出异常第26页,共33页。6.4 自定义异常通过继承Exception类或它的子类,实现自定义异常类。对于自定义异常,必须采用throw语句抛出异常,这种类型的异常不会自行产生。可以通过扩展Exception类来创建异常类。用户定义的异常同样要用trycatch捕获,但必须由用户抛出 throw new MyException。第27页,共33页。6.4 自定义异常【实例11】/ myException.javaclass myException extends Exception class UserTrial int num1,num2

18、; public UserTrial(int a,int b) num1=a; num2=b; void show() throws myException if (num10) throw new myException();System.out.println(Value1=+ num1);System.out.println(Value2 =+num2);【实例11】class myExceptionThrow public static void main(String args) UserTrial trial =new UserTrial(-1,1); try trial.show(); catch (myException e) System.out.println(Illegal Values: Caught in main); 第28页,共33页。【实例11】代码说明:(1)在上述给出的代码里,称myException类从Exception类扩展而来。(2)UserTrial类有一个能引发称为myException的自定义异常的方法。(3)在 myExceptionThrow类里的 main()方法创建 UserTrial类的对象并传送错误值给构造方法。(4)main()方法的 try块调用 show()方法。(5)sho

温馨提示

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

评论

0/150

提交评论