Java高级程序设计
Java高 级 程序 设计
? 第一部分
– 第一章 Java入门基础
– 第二章 异常
– 第三章 Java Applet类型
– 第四章 图形用户界面 GUI(一) ——AWT
– 第五章 Java中的事件处理机制
– 第六章 图形用户界面 GUI(二) ——Swing
Java高 级 程序 设计
– 第七章 多线程
– 第八章 I/O输入输出流
– 第九章 Java数据库连接( JDBC)
– 第十章 Java网络编程
? 第二部分
– 第一章 Java API
– 第二章 Java与多媒体
– 第三章 Java Bean基础
Java高级程序设计 异常
第二章 异常
? 2.1 什么是异常
– 2.1.1 异常处理基础
– 2.1.2 Java异常处理机制
? 2.2 异常的类型
– 2.2.1 Java异常类类型
– 2.2.2 Java异常类组成
? 2.3 未被捕获的异常
– 2.3.1 未被捕获的异常
? 2.4 try…catch 语句
– 2.4.1 系统自定义异常的处理
– 2.4.2 使用多重 catch语句、嵌套 try语句
Java高级程序设计 异常
第二章 异常
? 2.5 自定义异常与 throw关键字
– 2.5.1 创建自己的异常
– 2.5.2 使用 throw抛出异常
? 2.6 throws与 finally关键字
– 2.6.1 使用 throws声明异常
– 2.6.2 使用 finally关键字
? 2.7 Java的内臵异常
– 2.7.1 Java的内臵异常
Java高级程序设计 异常
2,1 什么是异常
? 语法错误和运行错误,
– 对类似于 C++这样的高级编程语言来说,捕获程序出错信息
最理想的阶段是在编译期间,即试图运行程序以前。然而,
并非所有错误都能在编译期间检测到。有些问题可能会在程
序运行时才暴露出来。例如,想打开的文件不存在、网络连
接中断、受控操作数超出预定范围、除数为 0等等。
– 我们一般称编译时被检测出来的错误为 语法错误,这种错误
一旦产生并不会生成运行代码。
– 而另一种是 运行错误,它是在程序运行时代码序列中产生的
一种出错情况。这种运行错误倘若没有及时进行处理,可能
会造成程序中断、数据遗失乃至系统崩溃等问题。这种运行
错误也就是我们常说的,异常” 。
Java高级程序设计 异常
2,1 什么是异常
? 早期语言打开文件的程序段
readFile {
open the file; // 打开文件
read the file into memory; // 将文件读入内存;
close the file; // 关闭该文件;
}
? 处理异常后的程序段
readFile {
int errorCode=0;
open the file;
if ( theFileOpen ) {
determine its size; // 测定文件长度
if ( gotEnoughMemory ) {
read the file into memory;
if ( readFailed )
{ errorCode = -1;}
} else {
errorCode = -2;}
} else {
errorCode = -3;}
close the file;
return errorCode;
}
Java高级程序设计 异常
2,1 什么是异常
? Java异常处理机制,
– 为了能够及时有效地处理程序中的运行错误,Java中引入了异
常和异常类的概念。
– 在 Java中定义了很多异常类,每个异常类都代表了一种常见的
运行错误,类中包含了该运行错误的信息和处理错误的方法等
内容。
– 每当 Java程序运行过程中发生一个可识别的运行错误时,即该
错误有一个异常类与之相对应时,系统都会产生一个相应的该
异常类的对象。一旦一个异常对象产生了,就将其抛出到其调
用程序中,发出已经发生问题的信号。然后,调用方法捕获抛
出的异常,在可能时,再恢复回来。
Java高级程序设计 异常
2,2 异常的类型
? Java异常体系图,
Java高级程序设计 异常
2,2 异常的类型
? Java异常类类型描述,
– Throwable类 是类库 java.lang包中的一个类,它派生了两个子类:
Exception和 Error。其中 Error类由系统保留,而 Exception类则供应用程
序使用。
– Error类 描述了 Java程序运行期间系统内部的错误以及资源耗尽的情况,
如动态链接失败、虚拟机错误等,通常在 Java编程语言中,Error类定义
被认为是不能恢复的严重错误条件。在大多数情况下,当遇到这样的错 误时,建议让程序中断。
– Exception类 是 Java程序中大量处理的异常,该类又可分为两类:从
RuntimeException衍生出来的异常和衍生于 Exception的其他子类的异
常。
– RuntimeException类 一般是由编程错误产生的,出现这类异常时,程序
员需调试程序避免这类异常的产生,该类异常一般包括错误的造型、数 组越界存取、空指针访问等。
– 衍生于 Exception的其他子类的异常一般是由于不可预测因素造成的,使
得语法正确的程序出现了问题,该类异常一般包括试图越过文件尾继续
存放、试图打开一个错误的 URL等。
Java高级程序设计 异常
2,2 异常的类型
? Exception类的构造方法有四个:
– public Exception( )
– public Exception(String message)
– public Exception(String message,Throwable cause)
– public Exception(Throwable cause)
– 第二个构造方法可以接受字符串参数传入的信息,该信息通
常是对该异常所对应的错误的描述。
– 第三个构造方法中 cause参数保存出错原因,便于以后使用
Throwable.getCause( )方法重获,该参数可为空。
Java高级程序设计 异常
2,2 异常的类型
? Java异常类的常用方法,
– Exception类的常用方法:
Java高级程序设计 异常
2.3 未被捕获的异常
? 未被捕获的异常,
– 下面的小程序包括一个故意导致被零除错误的表达式。
? class Exc0 {
public static void main(String args[]) {
int d = 0;
int a = 42 / d;
}
}
– 下面是由标准 javaJDK运行解释器执行该程序产生的输出:
? java.lang.ArithmeticException,/ by zero
at Exc0.main(Exc0.java:4)
Java高级程序设计 异常
2.3 未被捕获的异常
? 未被捕获的异常,
– 当 Java运行时系统检查到被零除的情况,它构造一个新的异
常对象然后引发该异常。这导致 Exc0的执行停止,因为一旦
一个异常被引发,它必须被一个异常处理程序捕获并且被立
即处理。
– 任何不是被你程序捕获的异常最终都会被该默认处理程序处
理。 默认处理程序显示一个描述异常的字符串,打印异常发
生处的堆栈轨迹并且终止程序。
Java高级程序设计 异常
2.3 未被捕获的异常
? 未被捕获的异常,
– 注意,类名 Exc0,方法名 main,文件名 Exc0.java和行数 4是
怎样被包括在一个简单的堆栈使用轨迹中的。
– 注意,引发的异常类型是 Exception的一个名字叫做
ArithmeticException的子类,该子类更明确的描述了何种类
型的错误方法。
Java高级程序设计 异常
2.3 未被捕获的异常
? 未被捕获的异常,
– 下面是前面程序的另一个版本,它介绍了相同的错误,但是
错误是在 main( )方法之外的另一个方法中产生的:
? class Exc1 {
static void subroutine() {
int d = 0;
int a = 10 / d;
}
public static void main(String args[]) {
Exc1.subroutine();
}
}
Java高级程序设计 异常
2.3 未被捕获的异常
? 未被捕获的异常,
– 下面是由标准 javaJDK运行解释器执行该程序产生的输出:
? java.lang.ArithmeticException,/ by zero
at Exc1.subroutine(Exc1.java:4)
at Exc1.main(Exc1.java:7)
– 如你所见,栈底是 main的第 7行,该行调用了 subroutine( )方
法。该方法在第 4行导致了异常。调用堆栈对于调试来说是很
重要的,因为它查明了导致错误的精确的步骤。
Java高级程序设计 异常
2.4 try…catch 语句
? 使用 try和 catch
– 尽管由 Java运行时系统提供的默认异常处理程序对于调试是很
有用的,但通常你希望自己处理异常。
– 这样做有两个好处。 第一,它允许你修正错误。第二,它防止
程序自动终止。
– 为防止和处理一个运行时错误,需要把你所要监控的代码放进
一个 try块就可以了。紧跟着 try块的,包括一个说明你希望捕
获的错误类型的 catch子句。
Java高级程序设计 异常
2.4 try…catch 语句
? 下面是一个异常处理块的通常形式:
– try {
// block of code to monitor for errors
}
catch (ExceptionType1 exOb) {
// exception handler for ExceptionType1
}
catch (ExceptionType2 exOb) {
// exception handler for ExceptionType2
}
//,..
finally {
// block of code to be executed before try block ends
}
? 这里,ExceptionType 是发生异常的类型。
Java高级程序设计 异常
2.4 try…catch 语句
? 举例:
– class Exc2 {
public static void main(String args[]) {
int d,a;
try { // monitor a block of code.
d = 0;
a = 42 / d;
System.out.println(―This will not be printed.‖);
} catch (ArithmeticException e) {
System.out.println(―Division by zero.‖);
}
System.out.println(―After catch statement.‖);
}
}
? 该程序输出如下:
– Division by zero.
After catch statement.
Java高级程序设计 异常
2.4 try…catch 语句
? 使用 try和 catch
– 注意:一旦异常被引发,程序控制由 try块转到 catch块。执行
永远不会从 catch块“返回”到 try块。
– 一个 try和它的 catch语句形成了一个单元。 catch子句的范围限
制于 try语句前面所定义的语句。
– 一个 catch语句不能捕获另一个 try声明所引发的异常(除非是
嵌套的 try语句情况)。
– 被 try保护的语句声明必须在一个大括号之内。不能单独使用
try 。
– 构造 catch子句的目的是解决异常情况并且像错误没有发生一
样继续运行。
Java高级程序设计 异常
2.4 try…catch 语句
? 使用多重 catch语句、嵌套 try语句
– 某些情况,由单个代码段可能引起多个异常。处理这种情况,
你可以定义两个或更多的 catch子句,每个子句捕获一种类型
的异常。
– 当你用多 catch语句时,异常子类必须在它们任何父类之前使
用。这样,如果子类在父类后面,子类将永远不会到达,而且,
Java中有不能到达的代码是一种语法错误。
– 各个异常都派生于同一超类。如果一个 catch处理方法用于捕
获某个超类类型的异常对象,则它也可以捕获该类的所有子类
的对象。这使得用一条简洁的 catch子句表达式就能处理多个
相关的错误,并且允许了多态性地处理这些相关的异常。
Java高级程序设计 异常
2.5 自定义异常
与 throw关键字
? 创建自己的异常,
– 系统定义的异常主要用来处理系统可以预见较为常见的运行
错误,对于某个应用所特有的运行错误,则需要编程人员根
据程序的特殊逻辑在用户程序里自己创建用户自定义的异常
类和异常对象。
– 用户定义异常可 通过扩展 Exception类来创建 的。这种异常类
可以包含一个“普通”类所拥有的构造函数、变量以及方法。
Java高级程序设计 异常
2.5 自定义异常
与 throw关键字
? throw关键字的使用,
– 用户程序自定义的异常不可能依靠系统自动抛出,必须借
助于 throw语句来定义何种情况算是产生了此种异常对应的
错误,并应该抛出这个异常类的新对象。
– 程序执行在 throw语句之后立即停止;后面的任何语句不被
执行。最紧紧包围的 try块用来检查它是否含有一个与异常
类型匹配的 catch语句。如果发现了匹配的块,控制转向该
语句;如果没有发现,次包围的 try块来检查,以此类推。
– 如果没有发现匹配的 catch块,默认异常处理程序中断程序
的执行并且打印堆栈轨迹。
Java高级程序设计 异常
2.5 自定义异常
与 throw关键字
? throw关键字的使用,
– Throw语句的通常形式如下,throw ThrowableInstance;
– 这里,ThrowableInstance一定是 Throwable类类型或
Throwable子类类型的一个对象。
– 注意,简单类型,例如 int或 char,以及非 Throwable类,例
如 String或 Object,不能用作异常。
– 有两种可以获得 Throwable对象的方法:在 catch子句中使用
参数或者用 new操作符创建。
Java高级程序设计 异常
2.6 throws与 finally关键字
? throws关键字的使用,
– 如果一个方法不能处理它自己所引发( throw)的代码,我们
必须用关键字 throws声明该方法可能引发的所有异常。
– 主要是为了通知欲调用此方法的方法。由于该方法包含 throw
语句,所以要准备接受和处理它在运行过程中可能会抛出的
异常。
– throws总是和方法说明出现在一起的。其形式如下:
? type method-name( parameter-list ) throws exception-list {
// body of method
}
– exception-list是该方法可引发的的异常列表以逗号分割。
Java高级程序设计 异常
2.6 throws与 finally关键字
? throws关键字的使用注意事项,
– 如果一个方法可以导致一个异常但不处理它,它必须指定这
种行为以使方法的调用者可以保护它们自己而不发生异常
– 做到这点你可以在方法声明中包含一个 throws子句。
– 一个 throws子句列举了一个方法可能引发的所有异常类型。
– 这对于除 Error 或 RuntimeException及它们子类以外类型的
所有异常是必要的。
– 一个方法可以引发的所有其他类型的异常必须在 throws子句
中声明。如果不这样做,将会导致编译错误。
Java高级程序设计 异常
2.6 throws与 finally关键字
? 处理或声明规则,
– 为了写出健壮的代码,Java编程语言要求,当一个方法在栈
上发生 Exception(它与 Error或 RuntimeException不同)时,
那么,该方法必须决定如果出现问题该采取什么措施。程序
员可以做满足该要求的两件事:
? 第一,通过将 Try{} catch(){}块纳入其代码中,在这里捕获给
被命名为属于某个超类的异常,并调用方法处理它。即使 catch块是
空的,这也算是处理情况。
? 第二,让被调用的方法表示它将不处理异常,而且该异常将被抛回到
它所遇到的调用方法中。它是按如下所示通过用 throws子句标记的该
调用方法的声明来实现的:
public void troublesome() throws IOException
Java高级程序设计 异常
2.6 throws与 finally关键字
? finally关键字的使用,
– 在 Java语言中, 当异常抛出时, 程序将跳出 try块, 执行 try-
catch语句块后面的程序代码, 然而在某些情况下, 我们希望
无论异常发生还是被捕获时, 有些语句必须执行 。 例如无论
出现任何异常情况, 我们都需要进行保存数据, 关闭文件等
操作 。
– finally语句解决了这一问题,我们只需在 try-catch语句块后接
一个 finally块,不管是否发生异常,都将执行 finally块中的代
码。
Java高级程序设计 异常
2.7 Java的内臵异常
? Java的内臵异常,
– 在标准包 java,lang中, Java定义了若干个异常类 。 其中多数
从 RuntimeException派生的异常都自动可用, 而且它们不需
要通知所有欲调用此方法的方法来检查该异常, 故不需要被
包含在任何方法的 throws列表中 。 这被叫做 不受控的异常 。
因为编译器不检查它来看一个方法是否处理或引发了这些异
常 。
– java,lang定义的其他异常必须在方法的 throws列表中包括,
方法产生其中的某个异常但是不能自己处理它,这些叫做 受
控的异常 。
Java高级程序设计 异常
2.7 Java的内臵异常
? 不受控的异常:
Java高级程序设计 异常
2.7 Java的内臵异常
? 不受控的异常:
– 不受控异常的出现表示一种设计或实现问题。也就是说,它
表示如果程序运行正常,从不会发生的情况,比如,数组索
引不超出数组界限则 ArrayIndexOutOfBoundsException异常
从不会抛出。通常对它不做处理,会导致一个运行时错误信
息。
– 尽管编译器对于不受控异常没有捕获或者声明的强制要求,
但知道可能发生这种异常时也应提供合适的异常处理代码 。
Java高级程序设计 异常
2.7 Java的内臵异常
? 受控的异常:
Java高级程序设计 异常
小结
? 使用异常:
– 异常处理为控制具有很多动态运行时特性的复杂程序提供了
一个强大的机制。把 try,throw,和 catch当成处理错误简洁
及程序逻辑上的反常边界条件是很重要的。
– 如果你像多数程序员一样,那么你可能习惯于在方法失败时
返回一个错误代码。在你用 Java编程时,你应该打破这个习
惯。当方法可能失败时,引发一个异常。这是处理失败模式
的一个更简洁的方法。
Java高级程序设计 异常
小结
? 掌握:
– 定义异常
– 使用 try,catch语句
– 使用 throw,throws和 finally关键字
? 理解:
– 异常的分类
? 了解:
– 程序中引入异常机制的好处