第6章 Java异常处理

更新时间:2023-05-23 03:23:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Java异常处理

返回总目录

第6章 Java异常处理 章 异常处理教学内容6.1概述 6.2异常的类型 6.3Java异常产生与捕捉

Java异常处理

返回目录

6.1概述 概述异常就是在程序运行时由代码所产生的不正常状态。换句话说, 异常就是一个运行错误。在不支持异常处理的计算机语言中,错误 必须由人工进行检查和处理,这显然麻烦而低效。Java语言提供了 异常处理机制,为方法的异常终止和出错处理提供了清楚的接口。 异常(exception)也就是异常事件(exceptional event)的简 称,它是在程序运行中出现的违背正常流向的事件。许多不同种类 的错误可以导致异常,从严重的硬件错误到简单的编程错误。当在 Java方法中发生这样的错误时,方法将创建一个异常对象,并把它 交给运行系统处理,运行系统负责找到处理错误的代码并执行。异 常对象包括异常的信息、类型和错误发生时程序的状态以及对该错 误的详细描述。

Java异常处理

返回目录

6.2异常的类型—异常类的层次结构 异常的类型 异常类的层次结构Java语言用继承的方式来组织各种异常。所有的异常都是 Throwable类或其子类,而Throwable类又直接继承于Object类。 Throwable类有两个子类:Error类与Exception类。Exception类又进 一步细分为RuntimeException(运行时异常)类和NonRuntimeException(非运行时异常)类。 如果程序中可能产生非运行时异常,就必须明确地加以捕捉并处 理,否则就无法通过编译检查。与非运行异常不同的是,错误 (Error)与运行异常(RuntimeException)不需要程序明确地捕捉并 处理。

Java异常处理

返回目录

6.2异常的类型—Exception类及其子类 异常的类型1.运行时异常 运行时异常表现在Java运行系统执行过程中的异常,它是指Java程序 在运行时发现的由Java解释抛弃的各种异常,包括算术异常、下标异常 等。下表列出几种常见的运行时异常。

Java异常处理

返回目录

6.2异常的类型—Exception类及其子类 异常的类型2.非运行时异常 非运行时异常是由编译器在编译时检测是否会发生在方法的执行过 程中的异常。非运行时异常是Non-RuntimeException及其子类的实 例,可以通过throw语句抛弃。Java在其标准包ng、java.util、 java.io、中定义的异常类都是非运行时异常类。下表列出了 常见的非运行时异常。

Java异常处理

返回目录

6.2异常的类型—Error类及其子类 异常的类型Error类定义了正常情况下不希望捕捉的错误。在捕捉Error子类时 要多加小心,因为它们通常在出现灾难性错误时被创建。下表列出 一些常见的Error异常类。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —产生异常 异常产生与捕捉 产生异常【引例1】 异常的产生。 import java.io.*; class Exception1 { public sta

tic void main(String args[]) { FileInputStream fis=new FileInputStream("text"); int b; while((b=fis.read())!=-1) { System.out.print((char)b); } fis.close(); } }

Java异常处理

返回目录

6.3Java异常产生与捕捉 —产生异常 异常产生与捕捉 产生异常该引例的第6行表明在一个文件“text”上建立文件输入流。运 行此程序时,如果这个文件并不存在,就会产生异常。另外,第8 行是读此文件的内容,如果该文件不存在,则从此文件中读取数据 时,也可能发生异常。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —产生异常 异常产生与捕捉 产生异常【引例2】 异常的产生。 class Exception2 { public static void main(String args[]) { int a=0,b=0; a=36/b; System.out.println("a="+a); } }

Java异常处理

返回目录

6.3Java异常产生与捕捉 —产生异常 异常产生与捕捉 产生异常从该引例的第6行不难看出,除数为零。因此,运行此程序时必然 会发生除零溢出的异常事件,使程序无法继续运行。 上面的两个引例都有或可能有异常产生。对于一些异常,在程序中 必须对它进行处理,否则编译程序时会指出错误,如【引例1】;但 对另一些异常,在程序中可以不作处理,而直接由运行系统来处理, 如【引例2】。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常其语法为: try { 正常程序段, 正常程序段 可能抛弃异常 } catch(异常类 异常变量 异常类1 异常类 异常变量) { 捕捉异常类1有关的处理程序 捕捉异常类 有关的处理程序 段 } catch(异常类 异常变量) 异常类2 异常变量 异常类 { 捕捉异常类2有关的处理程序 捕捉异常类 有关的处理程序 段 } … finally { 退出异常处理程序段 }

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常1.try 用来监视所在的程序块是否发生异常,如果发生异常就抛弃它。对 于系统产生的异常或程序块中未用try监视所产生的异常,将一律被 Java运行系统自动抛弃。 2.catch 用来捕捉try程序块中所抛弃的异常,并根据异常类型采取相应的方 法进行处理。每个try程序块后面紧接着一个或多个catch语句,用于 捕捉try程序块中所抛弃的一个或多个异常。catch语句只需要一个形 式参数,参数类型给出它能够捕捉的异常类型,这个类必须是 Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递 给catch块,在catch块中是对异常对象进行处理的代码。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常【边学边练6.1】 捕捉【引例1】中的异常。 import java.io.*; class Exception3 { public static void main(String args[]) { try { FileInputStream fis=new FileInputStream("text"); int b; while((b=fis.read())!=-1) {

System.out.print((char)b); } fis.close();

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常这里使用了两个catch语句分别对try代码块中可能出现的两个异常 事件进行处理。 第一种情况,如果要打开的文件“text”在当前目录中不存在,程序运 行时会抛弃一个FileNotFoundException异常对象。由于第一个catch 语句与该异常类型匹配,所以程序将执行第一个catch语句,于是就会 显示下面的信息: java.io.FileNotFoundException:text(系统找不到指定文件。) 一般地,程序中如果有多个catch语句,那么,若有一个catch语句 的异常与抛弃的异常对相匹配,那么,此catch语句将被执行,其他 catch语句将被忽略。此例中,由于第一个catch语句首先得到匹配, 第二个catch语句将不会被执行。因此在安排catch语句的顺序时,首 先应该捕捉最特殊的异常,然后再逐渐一般化。通常在指定所捕捉的 异常类型时,应该避免选择最一般的类型(如Exception)。否则,当 异常事件发生时,程序中不能确切判断异常的具体类型并作出相应处理 以从错误中恢复。 第二种情况,如果要打开的文件“text”在当前目录中存在,程序的运 行结果会显示“text”文件中的内容。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常3.finally 捕捉异常的最后一步是通过finally语句为异常处理提供一个统一的 出口,使得在控制流转到程序的其他部分以前,能够对程序的状态作 统一的管理。不论在try代码块中是否发生了异常事件,finally代码块 中的语句都会被执行。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常4.抛弃异常:throw throw语句明确地抛弃一个异常。throw语句的一般格式如下: throw <异常对象实例 异常对象实例>; 异常对象实例 其中,<异常对象实例>必须是Throwable类或其子类的一个对象, 简单数据不能用于异常。 throw语句会中断程序流的执行,其后的语句将不会被执行。系统 会检测离throw最近的try块,看是否存在与throw语句抛弃的异常类型 相匹配的catch语句。如果找到匹配的catch语句,则控制转到catch语 句中。如果没找到匹配的catch语句,这个程序将被中断。下面的程序 产生并抛弃了一个异常,捕捉到这个异常的处理又抛弃一个异常到外 部调用方法的处理中。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常【边学边练6.3】 利用throw语句抛弃异常的例子。 public class Exception5 { static void demoproc() { try { throw new NullPointerException("demo");//抛弃一个 异常 } catch(NullPointerException e) { System.out.println("捕捉内部异

常.");//捕捉demoproc 内部异常 throw e;//抛弃另一个异常

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常从程序结构中可以看到,main()方法创建了一个异常处理块,在 demoproc()方法中创建了另一个异常处理块。所以,这个程序有两 次机会处理同一个错误。执行此程序时,首先调用 demoproc() 方 法。在demoproc()中先抛弃一个NullPointerException异常,由 demoproc()内部的catch语句捕捉到,输出“捕捉内部异常”字样后, 再次抛弃一个同样的异常。由于该异常在demoproc()方法中不能被 捕捉到,所以只能被main()方法中的catch语句捕捉到并处理之。因 此,程序的运行结果如下: 捕捉内部异常 再次捕捉异常:ng.NullPointerException:demo

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常5.声明抛弃异常:throws 如果一个方法可能抛弃一个异常而它自己又没有处理方法,那么异 常处理的任务就交给调用者去完成,此时,必须在方法中包括throws 子句,以便该方法的调用者捕捉该异常。一个throws子句列出了一个 方法可能抛弃的异常类型。包括throws子句的方法声明的一般格式如 下: <类型说明 方法名 参数列表 throws <异常类型表 类型说明> 参数列表) 异常类型表> 类型说明 方法名(参数列表 异常类型表 { 方法体 } 下面的程序试图抛弃一个它不捕捉的异常,因为这个程序没有指定 一个throws子句来声明抛出异常,所以程序不能编译通过。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常【边学边练6.4】 无声明的抛弃异常。 public class Exception6 { static void throwOne() { System.out.println("抛弃内部异常."); throw new IllegalAccessException("demo"); } public static void main(String[] args) { throwOne(); } } 修改后的正确程序如下。

Java异常处理

返回目录

6.3Java异常产生与捕捉 —捕捉异常 异常产生与捕捉 捕捉异常【边学边练6.5】 声明抛弃异常。 public class Exception7 { static void throwOne() throws IllegalAccessException { System.out.println("抛弃内部异常."); throw new IllegalAccessException("demo"); } public static void main(String[] args) { try { throwOne(); } catch(IllegalAccessException e)

本文来源:https://www.bwwdw.com/article/2wh4.html

Top