第六讲-异常处理_第1页
第六讲-异常处理_第2页
第六讲-异常处理_第3页
第六讲-异常处理_第4页
第六讲-异常处理_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、第六讲异常处理异常的概念什么是异常? 异常是在程序执行过程中发生的打断程序正常执行指令流的事件 E.g., 除数为0 期望打开一个文件,但传入了一个目录名 试图”hello”字符串转换成整数 数组访问越界 访问空引用的内容 C及其它早期语言的错误处理模式n 返回某个特殊值或设置某个错误标志n 由接收者对返回值或标志进行检查判断是否发生错误n 但是,程序员经常不会去检查错误。Java的异常处理n 用强制规定的形式消除错误处理过程中随心所欲的因素异常的抛出和捕获 抛出异常 当在一个方法内部发生错误时,生成一个异常对象,交给运行时系统 异常对象包含错误信息,如错误类型、错误发生时程序的状态等 创建异

2、常对象并将其交给运行时系统的过程称为抛出异常 捕获异常 运行时系统尝试沿方法调用栈沿方法调用栈找到某段代码处理异常 一旦找到能处理异常的代码,则终止查找过程 如果遍历整个调用栈都找不到能够处理该异常对象的代码,则程序终止异常的抛出和捕获示意图三种异常类型检测异常(Checked exception) 应用程序应该期望到并从能从中恢复的异常 E.g., java.io.FileNotFoundException 必须在程序中处理或在方法定义时声明必须在程序中处理或在方法定义时声明 除了Error, RuntimeException,其余的异常都是checked exception错误(Error

3、) 与应用程序执行逻辑无关的错误,程序难以预期和从中恢复。 E.g., 读文件过程中的硬件错误 不需要在程序中处理 Error及其之类运行时异常(Runtime Exception) 应用程序有关的错误,但应用程序难以预期和恢复。通常意味着编程逻辑错误。 E.g., NullPointerException RuntimeException及其子类Java语言中的部分异常类异常代码的处理 对于可能抛出检测异常(checked exception)的代码,应该选择下面两种方法之一,否则程序无法编译: try-catch-finally 处理异常 异常声明try-catch-finally 异常捕

4、获n try块 异常处理n catch子句n 可以有多个 finally清理(不是必须的)n 无论try块是否抛出异常,都将得到执行n finally块通常用于进行资源的清理工作try /code that might generate exceptions;catch(Type1 id1) /Handle exceptions of Type1catch(Type2 id2) /Handle exceptions of Type2catch(Type3 id3) /Handle exceptions of Type3finally /无论是否抛出异常,finally段的代码都将得到执行 异常

5、匹配顺序 从try块后面的第一个catch子句开始匹配,直到找到一个catch子句为止。 一旦找到,则不再匹配后续的catch子句 因此,应尽量将子类异常放在前面,而将将子类异常放在前面,而将父类异常放在后面父类异常放在后面,特别地,Exception可以放在最后一个catch子句,标识匹配所有由Exception继承来的子类/ Note: 该文件无法通过编译 import java.io.*; import java.util.List; import java.util.ArrayList;public class ListOfNumbers private List list; priv

6、ate static final int SIZE = 10; public ListOfNumbers () list = new ArrayList(SIZE); for (int i = 0; i SIZE; i+) list.add(new Integer(i); public void writeList() PrintWriter out = new PrintWriter(new FileWriter(OutFile.txt); for (int i = 0; i SIZE; i+) out.println(Value at: + i + = + list.get(i); out

7、.close(); public FileWriter(String filename) throws IOException当文件名filename是一个目录名,或不存在但无法被创建,或因为任何其它原因无法被创建,则应抛出IOException当i=list.size()时,会抛出IndexOutOfBoundsExceptionimport java.io.*; import java.util.List; import java.util.ArrayList;public class ListOfNumbers private List list; private static fina

8、l int SIZE = 10; public ListOfNumbers () list = new ArrayList(SIZE); for (int i = 0; i SIZE; i+) list.add(new Integer(i); public void writeList() try PrintWriter out = new PrintWriter(new FileWriter(OutFile.txt); for (int i = 0; i SIZE; i+) out.println(Value at: + i + = + list.get(i); catch(IOExcept

9、ion exp) System.out.println(“Caught IOException: “+exp.getMessage(); finally if(out!=null) System.out.println(Closing PrintWriter); out.close(); else System.out.println(PrintWriter not open); 用try-catch-finally处理检测异常IndexOutOfBoundsException不必要显式捕获异常声明 当一个方法内部抛出异常(Error和RuntimeException除外)时,而不想亲自进行异

10、常处理时,必须在方法声明中通过throws予以声明 由方法调用者负责处理异常 返回类型返回类型 方法名方法名(参数列表参数列表) throws 异常列表异常列表public void writeList() throws IOException, IndexOutOfBoundsExceptionpublic void writeList() throws IOException 抛出异常 任何代码都可以抛出异常 自己编写的代码 别人编写的第三方代码 JAVA运行时环境 通过throw语句抛出异常 所有抛出的异常都必须是Throwable的直接或间接子类抛出异常语句 throw语句if(t=n

11、ull) throw new NullPointerException(“t=null”);if(i=array.length) throw new ArrayIndexOutofBoundsException(); 异常声明属于方法声明的一部分。子类重写父类的方法时,不能抛出比父类方法更多的异常。但可以抛出父类声明的异常的子类异常 Why?import java.util.*;class ExceptionOne extends Exception class ExceptionTwo extends Exception class ExceptionThree extends Except

12、ionOneclass ExceptionFour extends ExceptionTwoclass BaseClass public void f() throws ExceptionOne throw new ExceptionOne(); public class DerivedClass extends BaseClass public void f() throws ExceptionOne, ExceptionTwo /编译错误,不能抛出父类方法未声明的异常 Random rand = new Random(); if(rand.nextInt(15)5)throw new Ex

13、ceptionOne(); elsethrow new ExceptionTwo(); public static void main(String args) DerivedClass d = new DerivedClass(); tryd.f(); catch(ExceptionOne one) catch(ExceptionTwo two) srccnedunjnucsabyssoopch12DerivedClass.java:15: .njnu.cs.abyssoop.ch12.DerivedClass 中的 f() 无法覆盖 .njnu.cs.abyssoo

14、p.ch12.BaseClass 中的 f();被覆盖的方法不抛出 .njnu.cs.abyssoop.ch12.ExceptionTwo public void f() throws ExceptionOne, ExceptionTwo import java.util.*;class ExceptionOne extends Exception class ExceptionTwo extends Exception class ExceptionThree extends ExceptionOneclass ExceptionFour extends ExceptionTwo

15、class BaseClass public void f() throws ExceptionOnethrow new ExceptionOne(); public class DerivedClass extends BaseClass public void f() throws ExceptionThree /可以抛出父类方法声明异常的子类异常throw new ExceptionThree(); public static void main(String args)DerivedClass d = new DerivedClass();try d.f();catch(Excepti

16、onOne one) 为何要对子类抛出的异常类型进行限制 人们通常愿意针对基类或接口进行编程,而隐藏具体类的细节 利用多态进行运行时动态绑定 如果子类抛出了父类未声明的异常,则针对父类的代码将会失效import java.util.*;class ExceptionOne extends Exception class ExceptionTwo extends Exception class ExceptionThree extends ExceptionOneclass ExceptionFour extends ExceptionTwoclass BaseClass public void

17、 f() throws ExceptionOne throw new ExceptionOne(); class DerivedClass extends BaseClass public void f() throws ExceptionThree throw new ExceptionThree(); class ProgramUseBaseInterface public static void fun(BaseClass base) trybase.f(); catch(ExceptionOne one) /针对父类接口编程,只处理父类方法声明抛出的异常 public static v

18、oid main(String args)BaseClass base = new BaseClass();fun(base);base = new DerivedClass();/fun(derived); /如果子类抛出了父类未声明的异常,则函数f()将失效 自定义异常类 从已有的异常类继承,选择意思相近的异常类 class SimpleException extends Exception class MyException extends Exception public MyException() public MyException(String msg)super(msg); 有时需要设计适合自身应用程序的异常层次关系 异常最重要的是类名,一般根据异常的类型名可以判断采用哪些措施自己定义一个链表时可能的异常类层次设计异常链应用程序可以重新抛出一个新的异常作为对捕获的异常的响应异常之间存在因果关系 第一个异常引起了第二个异常异常链使得程序员可以知道异常发生的原因Throwable用于支持异常链的方法 Throwable getCause() Throwable initCause(Throwable) Throwabl

温馨提示

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

评论

0/150

提交评论