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

下载本文档

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

文档简介

1、例外处理,什么是例外(Exception),例外就是在程序的运行过程中所发生的异常事件,它中断指令的正常执行。,Java异常,Java程序运行过程中所发生的异常事件可分为两类: 错误(Error):JVM系统内部错误、资源耗尽等严重情况 违例(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: 对负数开平方根 空指针访问 试图读取不存在的文件 网络连接中断,例外示例,编译下面的程序: import java.io.*; class ExceptionDemo1 public static void main( String args ) FileInputStrea

2、m fis = new FileInputStream( text ); int b; while( (b=fis.read()!=-1 ) System.out.print( b ); fis.close( ); ,例外示例,C:javac ExceptionDemol.java ExceptionDemo1.java:6: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause of this method. FileInputStream fis

3、 = new FileInputStream( text ); ExceptionDemo1.java:8: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. while( (b=fis.read()!=-1 ) 2 errors,例外示例,编译和运行下面的程序: class ExceptionDemo2 public static void main( String args ) int a = 0; System.out.prin

4、tln( 5/a ); ,例外示例,C:javac ExceptionDemo2.java C:java ExceptionDemo2 java.lang.ArithmeticException: / by zero at ExceptionDemo2.main(ExceptionDemo2.java:4) 有些例外(异常)在编译的时候能够发现,有些是在运行的时候发现,例外处理机制,在Java程序的执行过程中,如果出现了异常事件,就会生成一个例外对象。 Java例外处理机制:抛出(Throw)例外和捕获(catch)例外 例外对象可能是由正在运行的方法生成,也可能由Java虚拟机生成,其中包含

5、一些信息指明异常事件的类型,以及当异常发生时程序的运行状态等。生成的例外对象传递给Java运行时系统(Java Runtime System),这一例外对象的产生和提交过程称为抛弃(throw)例外,例外处理机制,Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。寻找的对象从生成异常对象的代码块开始,沿着方法的调用栈逐层回溯,直到找到一个方法能够处理这种类型的异常为止。然后运行时系统把当前异常对象交给这个方法进行处理。这一过程称为捕获(catch)异常。 。 如果Java运行时系统找不到可以捕获例外的方法,则运行时系统将终止,相应的Java程序也将退出。 一个异常事件对应一个

6、例外对象。,例外类的层次,Error 动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类例外,也不会抛弃这种例外。 Exception 运行时例外(可以不处理) 继承于RuntimeException。Java编译器允许程序不对它们做出处理,必要时也可以处理。 非运行时例外(必须处理) 除了运行时例外之外的其他由Exception继承来的例外类。Java编译器要求程序必须捕获或者声明抛弃这种例外。,捕获例外 捕获例外是通过try-catch-finally语句实现的。 try ./可能发生例外的代码 catch( ExceptionName1 e ) ./例外处理代码 catch( E

7、xceptionName2 e ) ./例外处理代码 . finally .例外处理语句的统一出口 ,try 捕获例外的第一步是用try选定捕获例外的范围,由try所限定的代码块中的语句在执行过程中可能会生成例外对象并抛弃。,catch 每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的例外事件。catch语句只需要一个形式参数指明它所能够捕获的例外类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的例外对象传递给catch块. 在catch块中是对例外对象进行处理的代码,与访问其它对象一样,可以访问一个例外对象的变量或调用它的方法。getM

8、essage( )是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。,import java.io.*; public class ExceptionDemo1 public static void main(String args) try FileInputStream fis = new FileInputStream(text); /可能发生异常 int b; while ( (b = fis.read() != -1) System.out.println(b);

9、fis.close(); ,catch(FileNotFoundException ex) System.out.println(文件不存在异常.); System.out.println(ex.getMessage(); System.out.println(ex); ex.printStackTrace(System.out); catch (IOException ex) System.out.println(输入/输出异常.); System.out.println(ex); ,catch语句的顺序,捕获例外的顺序和不同catch语句的顺序有关,当捕获到一个例外时,剩下的catch语句

10、就不再进行匹配。 “匹配”是指catch语句的参数类型和异常对象的类型完全相同或者为异常对象的父类型。 在安排catch语句的顺序时,首先应该捕获最特殊的例外,然后再逐渐一般化。也就是一般先安排子类,再安排父类。,catch (IOException ex) System.out.println(输入/输出异常.); System.out.println(ex); catch(FileNotFoundException ex) System.out.println(文件不存在异常.); System.out.println(ex.getMessage(); System.out.println

11、(ex); ex.printStackTrace(System.out); 两个catch语句的顺序调整后,报告如下的错误: ExceptionDemo1.java: exception java.io.FileNotFoundException has already been caught at line 24, column 18,finally 捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。 可选的。, try File

12、InputStream fis = new FileInputStream(text); int b=0; System.out.println(5/b); catch(ArithmeticException e) finally if (fis!=null) System.out.println(“closing FileInputStream”); else System.out.println(“FileInputStream not open”); 通过finally可以正常的关闭文件。,通过一个完整的例子说明不同情况下的异常捕获,import java.io.*; public cl

13、ass ExceptionDemo1 public static void main(String args) FileInputStream fis = null; try System.out.println(第一个命令行参数是:+args0); fis = new FileInputStream(text); System.out.println(文件的内容是:); int b ; while ( (b = fis.read() != -1) System.out.print(char)b); System.out.println(n); fis.close(); ,catch (Fil

14、eNotFoundException ex) System.out.println(发生文件不存在的异常.); System.out.println(ex); catch (IOException ex) System.out.println(输入/输出异常.); System.out.println(ex); catch(IndexOutOfBoundsException e) System.out.println(“数组越界异常”); System.out.println(e); ,finally if (fis != null) System.out.println(正在关闭文件。);

15、try fis.close(); catch (IOException ex1) else System.out.println(文件输入流没有打开。); ,第一种情况:要打开的文件不存在时,程序运行时会生成FileNotFoundException异常对象,运行时系统把它交给第一个catch语句处理,最后执行finally语句,运行结果如下: 第一个命令行参数是:hello 发生文件不存在的异常。 java.io.FileNotFoundException: text (系统找不到指定的文件。) 文件输入流没有打开。,第二种情况,我们创建了文件“text”,但是在运行时,我们不给出任何参数,

16、这时会放生IndexOutOfBoundsException类的异常,运行时系统把它交给第三个catch语句处理,最后执行finally语句,执行结果如下: java.lang.ArrayIndexOutOfBoundsException: 0 at ExceptionDemo1.main(ExceptionDemo1.java:6) Exception in thread main 文件输入流没有打开。,第三种情况,程序正确执行try代码块后,执行finally语句,运行结果如下: 第一个命令行参数是:Hello 文件的内容是: let us begin to use java,let us

17、 begin to know java. 正在关闭文件。,声明抛弃例外,如果在一个方法中生成了一个例外,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃例外,使得例外对象可以从调用栈向后传播,直到有合适的方法捕获它为止。,声明抛弃例外(参考J2SDK文档),声明抛弃例外是在一个方法声明中的throws子句中指明的。例如: public int read () throws IOException . throws子句中同时可以指明多个例外,说明该方法将不对这些例外进行处理,而是声明抛弃它们: public static void main(String ar

18、gs) throws IOException,IndexOutOfBoundsException ,人工抛出异常,Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出 首先要生成异常对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。 IOException e =new IOException(); throw e; 可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误: throw new String(want to throw);,例外类的使用,自定义例外类必须是Throwable的直接或间接

19、子类,一般定义为Exception的子类 一个方法所声明抛弃的例外是作为这个方法与外界交互的一部分而存在的。方法的调用者必须了解这些例外,并确定如何正确的处理他们。,例外类的使用,FileInputStream 的API public FileInputStream(String name) throws FileNotFoundException,例外示例,import java.io.*; class ExceptionDemo1 public static void main( String args ) FileInputStream fis = new FileInputStream

20、( text ); ,例外类的使用,积极处理方式: import java.io.*; class ExceptionDemo1 public static void main( String args ) try FileInputStream fis = new FileInputStream( text ); catch(FileNotFoundException e) ,例外类的使用,消极处理方式: import java.io.*; class ExceptionDemo1 public static void main( String args ) throws FileNotFo

21、undException FileInputStream fis = new FileInputStream( text ); ,例外类的使用,如果采用消极处理方式,则由调用该方法的方法进行处理;但是调用该方法的方法也可以采用消极和积极两种处理方式,一直传递到Java运行环境.,例外类的使用,运行时例外则表示由运行时系统所检测到的程序设计问题或者API的使用不当问题,它可能在程序的任何地方出现: (1)对于运行时例外,如果不能预测它何时发生,程序可以不做处理,而是让Java虚拟机去处理它。 (2)如果程序可以预知运行时例外可能发生的地点和时间,则应该在程序中进行处理,而不应简单的把它交给运行时系统。,例外类的使用,(3)在自定义例外类时,如果它所对应的异常事件通常总是在运行时产生的,而且不容易预测它将在何时、何处发生,则可以把它定义为运行时例外,否则应定义为非运行时例外。,重写方法声明抛弃异常原则,重写方法不能抛出比被重写方法范围更大的异常类型,public class A public void methodA() throws IOException public class B1

温馨提示

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

评论

0/150

提交评论