精品课件-JAVA语言程序设计教程(张席)-第7章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 方法返回前需执行的代码块 } try语句块表示要尝试运行的代码块,try语句块中代码受异 常监控,其中代码发生异常时,会抛出异常对象。
7
第7章 Java异常处理 catch语句块会捕获try代码块中发生的异常,并在其代码块
中做异常处理。catch语句带一个Throwable类型的参数,表示可 捕获的异常类型。当try中出现异常时,catch会捕获到发生的异 常,并和自己的异常类型匹配,若匹配,则执行catch块中代码, 并将catch块参数指向所抛的异常对象。catch语句可以有多个, 用来匹配多个异常。某个异常与catch块一旦匹配成功,就不再 尝试匹配别的catch块了。通过异常对象可以获取异常发生时完 整的Java虚拟机堆栈信息,以及异常信息和异常发生的原因等。
4
第7章 Java异常处理 7.1.1 异常处理基础
异常即程序运行过程中发生的异常事件,如例7-1所描述。 程序运行时出现异常则生成异常对象,生成的异常对象被交给 Java虚拟机,Java虚拟机寻找相应的代码来处理这一异常。生成 异常对象并把它交给Java虚拟机的过程称为抛出(throw)异常。 在Java虚拟机得到一个异常对象后,它将会寻找处理这一异常的 代码。
} }
2
第7章 Java异常处理 编译代码时的显示结果如图7.1所示。 由编译信息可知,以上程序将产生FileNotFoundException
异常。因此,若希望程序正确运行,编译器需能够处理 FileNotFoundException异常。
3
第7章 Java异常处理
图7.1 例7-1的运行结果
}
20
第7章 Java异常处理 程序运行结果如图7.3所示。
显然,printStackTrace()方法可获得比getMessage() 方法更多的信息。
图7.3 例7-2的运行结果
21
第7章 Java异常处理 7.2 异常处理机制
7.2.1 捕获和处理异常 尽管Java运行时由系统提供的默认异常处理程序对于调试很
14
第7章 Java异常处理 Exception类是异常类,表示程序本身可以处理的异常。它
从父类Throwable中继承了成员变量和成员方法,只在自身类中 声明了一些构造方法。程序中的每一个异常对应于Exception类 的一个子类实例,异常对象中包含异常的位置和特征信息。这种 异常分两大类:运行时异常和非运行时异常。程序应当尽可能去 处理这些异常。
进一个try语句块。紧跟try语句块的是一个能够捕获程序员所希 望的错误类型的catch语句块。下面的程序包含一个处理例7-1中 FileNotFoundException异常的try语句块和catch语句块。
23
第7章 Java异常处理
【例 7-3】 捕获并处理例 7-1 中的异常。
import java.io.*; public class Example7_3 {
10
第7章 Java异常处理 7.1.2 异常的分类
Java把异常当作对象来处理,并定义一个基类 ng.Throwable作为所有异常的超类。在Java API中已 经定义了许多异常类,这些异常类分为两大类:错误(Error) 和异常(Exception)。Java异常体系结构呈树状,其层次结构 如图7.2所示。
有用,但程序员通常都希望能手动处理异常。这样做有两个好处。 第一,允许修正错误。第二,防止程序自动终止。但Java异常的 捕获和处理是一件不容易把握的事情,如果处理不当,不但会让 程序的可读性大大降低,而且导致系统性能低下,甚至引发一些 难以发现的错误。
22
第7章 Java异常处理 为防止和处理一个运行时错误,只需要把所要监控的代码放
24
第7章 Java异常处理
} catch (FileNotFoundException e){
System.out.println("Exception encountered:"+e); } System.out.println("After catch statement."); } }
程序运行结果如图 7.4 所示。
13
第7章 Java异常处理 1. Error与Exception类 Error类是错误类,表示仅靠程序本身无法修复的严重错误,
如内存溢出错误(OutOfMemoryError)、线程死亡错误 (ThreadDeath)等。这类异常发生时,Error类对象由Java虚拟机 生成并抛出给系统。本章不再讨论关于Error类型的异常处理, 因为它们通常是灾难性的致命错误,不是程序可以控制的。
第7章 Java异常处理 第 7 章 Java异常处理
7.1 异常处理概述 7.2 异常处理机制 7.3 finally子句 7.4 自定义异常
1
第7章 Java异常处理
7.1 异常处理概述 编写一个Java程序,打开本地磁盘下的D:\test.txt文件。
【例 7-1】 发生异常的程序示例。
import java.io.*; public class Example7_1 {
25
第7章 Java异常处理 图7.4 例7-3的运行结果
26
第7章 Java异常处理 注意在异常发生时,try语句块中的
“System.out.println("After opening");”语句是不会被执 行的。一旦异常被引发,程序控制由try语句块转到catch语句块, 而不会从catch语句块返回到try语句块。一旦执行了catch语句, 程序控制从整个try/catch块的下面一行继续。
显示堆栈轨迹
void printStackTrace(PrintStreamstream)
把堆栈轨迹送到指定的流
void printStackTrace(PrintWriterstream)
把堆栈轨迹送到指定的流
String toString( )
返 回 一 个 包 含 异 常 描 述 的 String 对 象 。当 输 出 一 个 Throwable 对象时,该方法被 println()调用
方法
描述
Throwable fillInStackTrace( )
返回一个包含完整堆栈轨迹的 Throwable 对象,该对象可 能被再次引发
String getLocalizedMessage( )
返回一个异常的局部描述
String getMessage( )
返回一个异常的描述
void printStackTrace( )
17
第7章 Java异常处理 7.1.3 异常的描述
异常类Exception的超类为Throwable类。Throwable类中定 义了方法来检索与异常相关的信息,并打印显示异常发生的栈跟 踪信息。这些方法的描述见表7.1。
18
第7章 Java异常处理
表 7.1 Throwable 类定义的方法
16
第7章 Java异常处理 非运行时异常是RuntimeException以外的异常,类型上都属
于Exception类及其子类,如IOException、SQLException等。 这些异常是检查异常,从程序语法角度讲是必须进行处理的异常, 如果不处理,程序就不能通过编译。一般情况下不自定义检查异 常。
11
第7章 Java异常处理
Throwable
Error
Exception
RuntimeException
非运行时异常
图7.2 Java异常体系结构
12
第7章 Java异常处理 所有异常类型都是内置类Throwable的子类,因此,
Throwable在异常类层次结构的顶层。Thorwable类有两个子类 Error和Exception,分别表示错误和异常。其中异常类 Exception又分为运行时异常(RuntimeException)和非运行时 异常,这两种异常有很大的区别,也称之为不检查异常 (Unchecked Exception)和检查异常(Checked Exception)。下 面将详细讲述这些异常之间的区别与联系。
8
第7章 Java异常处理 finally语句块是紧跟在catch语句后的语句块,不管try语
句块是否发生异常该语句块总会被执行。finally语句块总是在 方法返回前执行,目的是给程序一个补救的机会。这也体现了 Java语言的健壮性。
throw和throws的法描述如下。 public static void test() throws Exception{
Java异常处理过程通过5个关键字控制:try、catch、 finally、throw和throws。其中,try、catch和finally构成异 常处理的完整语法。
6
第7章 Java异常处理
try { //异常监控区域代码块
} catch (ExceptionType e) {
//ExceptionType类型异常处理 } finally {
public static void main(String args[]){ System.out.println("Before opening"); //FileReader 对象连接到 D:\test.txt 文件 FileReader reader=new FileReader("D:\\test.txt"); System.out.println("After opening");
5
第7章 Java异常处理 寻找异常处理方法的过程从生成异常的方法开始,沿着方法
的调用栈逐层回朔,直到找到包含相应异常处理的方法为止。然 后,Java虚拟机把当前异常对象交给这个方法进行处理。这一过 程称为捕获(catch)异常。如果查遍整个调用栈仍然没有找到合 适的异常处理方法,Java虚拟机将终止Java程序的执行。
19
第7章 Java异常处理
【例 7-2】 Exception 类型的方法示例。
public class Example7_2{ public static void main(String args[]){ try{ throw new Exception("My Exception"); }catch(Exception e){ System.out.println("getMessage:"+e.getMessage()); System.out.println("printStackTrace:"); e.printStackTrace(); } }
public static void main(String args[]){ try{ System.out.println("Before opening"); //FileReader 对象连接到 D:\test.txt 文件 //假设 D:\test.txt 文件不存在 FileReader reader=new FileReader("D:\\test.txt"); System.out.println("After opening");
//抛出一个检查异常 throw new Exception(“方法test中的Exception”); }
9
第7章 Java异常处理 throw关键字用于方法体内部,用来抛出一个Throwable类型
的异常。如果抛出了检查异常,则还应该在方法头部声明,方法 可能抛出的异常类型。该方法的调用者也必须检查和处理抛出的 异常。如果所有方法都层层上抛获取的异常,最终Java虚拟机会 进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果 抛出的是Error或RuntimeException,则该方法的调用者可选择 处理该异常。
15
第7章 Java异常处理 2. 运行时异常和非运行时异常 运行时异常都是RuntimeException类及其子类异常,如空对
象异常(NullPointerException)、算术异常 (ArithmeticException)、类型强制转换异常 (ClassCastException)、数组下标越界异常 (ArrayIndexOutOfBoundsException)、数值格式异常 (NumberFormatException)等。这些异常是不检查异常,程序可 以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错 误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
7
第7章 Java异常处理 catch语句块会捕获try代码块中发生的异常,并在其代码块
中做异常处理。catch语句带一个Throwable类型的参数,表示可 捕获的异常类型。当try中出现异常时,catch会捕获到发生的异 常,并和自己的异常类型匹配,若匹配,则执行catch块中代码, 并将catch块参数指向所抛的异常对象。catch语句可以有多个, 用来匹配多个异常。某个异常与catch块一旦匹配成功,就不再 尝试匹配别的catch块了。通过异常对象可以获取异常发生时完 整的Java虚拟机堆栈信息,以及异常信息和异常发生的原因等。
4
第7章 Java异常处理 7.1.1 异常处理基础
异常即程序运行过程中发生的异常事件,如例7-1所描述。 程序运行时出现异常则生成异常对象,生成的异常对象被交给 Java虚拟机,Java虚拟机寻找相应的代码来处理这一异常。生成 异常对象并把它交给Java虚拟机的过程称为抛出(throw)异常。 在Java虚拟机得到一个异常对象后,它将会寻找处理这一异常的 代码。
} }
2
第7章 Java异常处理 编译代码时的显示结果如图7.1所示。 由编译信息可知,以上程序将产生FileNotFoundException
异常。因此,若希望程序正确运行,编译器需能够处理 FileNotFoundException异常。
3
第7章 Java异常处理
图7.1 例7-1的运行结果
}
20
第7章 Java异常处理 程序运行结果如图7.3所示。
显然,printStackTrace()方法可获得比getMessage() 方法更多的信息。
图7.3 例7-2的运行结果
21
第7章 Java异常处理 7.2 异常处理机制
7.2.1 捕获和处理异常 尽管Java运行时由系统提供的默认异常处理程序对于调试很
14
第7章 Java异常处理 Exception类是异常类,表示程序本身可以处理的异常。它
从父类Throwable中继承了成员变量和成员方法,只在自身类中 声明了一些构造方法。程序中的每一个异常对应于Exception类 的一个子类实例,异常对象中包含异常的位置和特征信息。这种 异常分两大类:运行时异常和非运行时异常。程序应当尽可能去 处理这些异常。
进一个try语句块。紧跟try语句块的是一个能够捕获程序员所希 望的错误类型的catch语句块。下面的程序包含一个处理例7-1中 FileNotFoundException异常的try语句块和catch语句块。
23
第7章 Java异常处理
【例 7-3】 捕获并处理例 7-1 中的异常。
import java.io.*; public class Example7_3 {
10
第7章 Java异常处理 7.1.2 异常的分类
Java把异常当作对象来处理,并定义一个基类 ng.Throwable作为所有异常的超类。在Java API中已 经定义了许多异常类,这些异常类分为两大类:错误(Error) 和异常(Exception)。Java异常体系结构呈树状,其层次结构 如图7.2所示。
有用,但程序员通常都希望能手动处理异常。这样做有两个好处。 第一,允许修正错误。第二,防止程序自动终止。但Java异常的 捕获和处理是一件不容易把握的事情,如果处理不当,不但会让 程序的可读性大大降低,而且导致系统性能低下,甚至引发一些 难以发现的错误。
22
第7章 Java异常处理 为防止和处理一个运行时错误,只需要把所要监控的代码放
24
第7章 Java异常处理
} catch (FileNotFoundException e){
System.out.println("Exception encountered:"+e); } System.out.println("After catch statement."); } }
程序运行结果如图 7.4 所示。
13
第7章 Java异常处理 1. Error与Exception类 Error类是错误类,表示仅靠程序本身无法修复的严重错误,
如内存溢出错误(OutOfMemoryError)、线程死亡错误 (ThreadDeath)等。这类异常发生时,Error类对象由Java虚拟机 生成并抛出给系统。本章不再讨论关于Error类型的异常处理, 因为它们通常是灾难性的致命错误,不是程序可以控制的。
第7章 Java异常处理 第 7 章 Java异常处理
7.1 异常处理概述 7.2 异常处理机制 7.3 finally子句 7.4 自定义异常
1
第7章 Java异常处理
7.1 异常处理概述 编写一个Java程序,打开本地磁盘下的D:\test.txt文件。
【例 7-1】 发生异常的程序示例。
import java.io.*; public class Example7_1 {
25
第7章 Java异常处理 图7.4 例7-3的运行结果
26
第7章 Java异常处理 注意在异常发生时,try语句块中的
“System.out.println("After opening");”语句是不会被执 行的。一旦异常被引发,程序控制由try语句块转到catch语句块, 而不会从catch语句块返回到try语句块。一旦执行了catch语句, 程序控制从整个try/catch块的下面一行继续。
显示堆栈轨迹
void printStackTrace(PrintStreamstream)
把堆栈轨迹送到指定的流
void printStackTrace(PrintWriterstream)
把堆栈轨迹送到指定的流
String toString( )
返 回 一 个 包 含 异 常 描 述 的 String 对 象 。当 输 出 一 个 Throwable 对象时,该方法被 println()调用
方法
描述
Throwable fillInStackTrace( )
返回一个包含完整堆栈轨迹的 Throwable 对象,该对象可 能被再次引发
String getLocalizedMessage( )
返回一个异常的局部描述
String getMessage( )
返回一个异常的描述
void printStackTrace( )
17
第7章 Java异常处理 7.1.3 异常的描述
异常类Exception的超类为Throwable类。Throwable类中定 义了方法来检索与异常相关的信息,并打印显示异常发生的栈跟 踪信息。这些方法的描述见表7.1。
18
第7章 Java异常处理
表 7.1 Throwable 类定义的方法
16
第7章 Java异常处理 非运行时异常是RuntimeException以外的异常,类型上都属
于Exception类及其子类,如IOException、SQLException等。 这些异常是检查异常,从程序语法角度讲是必须进行处理的异常, 如果不处理,程序就不能通过编译。一般情况下不自定义检查异 常。
11
第7章 Java异常处理
Throwable
Error
Exception
RuntimeException
非运行时异常
图7.2 Java异常体系结构
12
第7章 Java异常处理 所有异常类型都是内置类Throwable的子类,因此,
Throwable在异常类层次结构的顶层。Thorwable类有两个子类 Error和Exception,分别表示错误和异常。其中异常类 Exception又分为运行时异常(RuntimeException)和非运行时 异常,这两种异常有很大的区别,也称之为不检查异常 (Unchecked Exception)和检查异常(Checked Exception)。下 面将详细讲述这些异常之间的区别与联系。
8
第7章 Java异常处理 finally语句块是紧跟在catch语句后的语句块,不管try语
句块是否发生异常该语句块总会被执行。finally语句块总是在 方法返回前执行,目的是给程序一个补救的机会。这也体现了 Java语言的健壮性。
throw和throws的法描述如下。 public static void test() throws Exception{
Java异常处理过程通过5个关键字控制:try、catch、 finally、throw和throws。其中,try、catch和finally构成异 常处理的完整语法。
6
第7章 Java异常处理
try { //异常监控区域代码块
} catch (ExceptionType e) {
//ExceptionType类型异常处理 } finally {
public static void main(String args[]){ System.out.println("Before opening"); //FileReader 对象连接到 D:\test.txt 文件 FileReader reader=new FileReader("D:\\test.txt"); System.out.println("After opening");
5
第7章 Java异常处理 寻找异常处理方法的过程从生成异常的方法开始,沿着方法
的调用栈逐层回朔,直到找到包含相应异常处理的方法为止。然 后,Java虚拟机把当前异常对象交给这个方法进行处理。这一过 程称为捕获(catch)异常。如果查遍整个调用栈仍然没有找到合 适的异常处理方法,Java虚拟机将终止Java程序的执行。
19
第7章 Java异常处理
【例 7-2】 Exception 类型的方法示例。
public class Example7_2{ public static void main(String args[]){ try{ throw new Exception("My Exception"); }catch(Exception e){ System.out.println("getMessage:"+e.getMessage()); System.out.println("printStackTrace:"); e.printStackTrace(); } }
public static void main(String args[]){ try{ System.out.println("Before opening"); //FileReader 对象连接到 D:\test.txt 文件 //假设 D:\test.txt 文件不存在 FileReader reader=new FileReader("D:\\test.txt"); System.out.println("After opening");
//抛出一个检查异常 throw new Exception(“方法test中的Exception”); }
9
第7章 Java异常处理 throw关键字用于方法体内部,用来抛出一个Throwable类型
的异常。如果抛出了检查异常,则还应该在方法头部声明,方法 可能抛出的异常类型。该方法的调用者也必须检查和处理抛出的 异常。如果所有方法都层层上抛获取的异常,最终Java虚拟机会 进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果 抛出的是Error或RuntimeException,则该方法的调用者可选择 处理该异常。
15
第7章 Java异常处理 2. 运行时异常和非运行时异常 运行时异常都是RuntimeException类及其子类异常,如空对
象异常(NullPointerException)、算术异常 (ArithmeticException)、类型强制转换异常 (ClassCastException)、数组下标越界异常 (ArrayIndexOutOfBoundsException)、数值格式异常 (NumberFormatException)等。这些异常是不检查异常,程序可 以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错 误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。