您的当前位置:首页正文

Java的异常处理机制

2023-03-12 来源:爱go旅游网


第30卷第2期 唐山师范学院学报 2008年3月 Vol.30 No.2 Journal of Tangshan Teachers College Mar. 2008

Java的异常处理机制

张洪波,高 伟

(唐山师范学院 计算机科学系,河北 唐山 063000)

摘 要:讨论了JAVA语言的异常处理技术,并举例说明了在程序设计中的应用。 关键词:JAVA;异常;异常处理 中图分类号: TP312

文献标识码:A

文章编号:1009-9115(2008)02-0077-03

Exception Handling of Java Language

ZHANG Hong-bo, GAO Wei

(Department of Computer Science, Tangshan Teachers College, Hebei Tangshan 063000, China)

Abstract: This paper discusses the Java language exception handling technology, and examples of applications in the design process were given.

Key words: JAVA; abnormal exception; handling

Java语言是Sun Microsystems公司开发的新一代的面向对象的程序设计语言,由于Java程序与平台的无关性,使得其不仅适合编写一般的软件,也更加适合编写Internet网上的软件。作为软件开发的一种革命性技术,Java的地位事实上已经得到确定。其中一个重要的原因就是,在设计Java程序的过程当中使用了异常处理机制。

异常处理机制是程序设计语言的重要标志之一,合理完备的异常处理可以使程序更加健壮,特别在大型软件项目的开发中,异常处理可以更快地确定错误的所在。Java语言中引入了异常(Exception)和异常类,类中包含了运行时错误的信息和处理错误的方法。

Java程序是在网络环境中运行的,安全成为需要首先考虑的重要因素之一。每当Java程序运行过程中发生一个可识别的运行错误时,系统都会产生一个相对应的该异常类的对象,即产生一个异常。为了能够及时有效地处理程序运行中出现的错误,必须在程序中编制异常处理代码,以确保不会产生死机、死循环或操作系统的损害。从而保证程序运行的安全性,这就是Java的异常处理机制。

1 什么是异常

异常是程序运行过程中出现的非正常情况,比如:除数为0、数组越界、文件找不到、要装入的类文件格式错误等。

传统的编程语言如C用if及goto语句来探测、处理错误,和常规程序混在一起,这些程序中充满了条件判断语句, 其可读性和维护性比较差。另外,由于程序员的经验不同,对出现的错误的估计能力也有差别。因此在面向过程的程序设计中,异常处理一直是影响程序设计质量的一个瓶颈。

在Java语言中采用了类似于C++的异常处理机制,把错误处理代码与“常规”代码分离出来,可在主流程外的任何地方处理异常,使程序中出现的异常问题以有序的、一致的方式进行处理,不仅增加了程序的稳定性和可读性,更重要的是规范了程序设计风格,有利于提供程序质量,为开发可靠性软件系统提供了强有力的支持。

2 异常的分类

异常本身作为一个对象(其中包含了该异常的详细信息),产生异常就是产生了一个异常对象。这个对象可能由应用程序本身产生,也可能由JAVA虚拟机(JVM)产生,这取决于产生异常的类型。异常主要是分如下两大类。

2.1 系统定义的异常类

Throwable类是类库java.lang包中的一个类,它产生了两个子类:Exception和Error。Error类又派生了一些子类,这些子类定义了通常无法捕捉并不能恢复的异常类型(如内存溢出)。当产生这种异常情况时,一般不能由应用程序直接

────────── 收稿日期:2007-03-29

作者简介:张洪波(1981-),女,满族,河北遵化人,从事计算机程序语言研究。 - 77 -

第30卷第2期 唐山师范学院学报 2008年3月

处理,必须交由操作系统处理。而Exception类及其子类则供应用程序使用。它有RuntimeException和IOException两个基本的子类,其中RuntimeException派发的各种异常由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。IOException主要用于处理程序输入输出中遇到的异常情况,这些异常是应用程序必须做出反应并处理的。

Throwable类定义了三个有用的方法其使用形式如下: Catch(NumberFormatException e) {System.out. println(e.getMessage());

//getMessage()得到有关异常的祥细信息的字符串 System.out.println(e.toString());

//toString()将对象转换为可以在屏幕上显示的字符串 System.out.println(e.printStackTrack()); //显示导致异常的方法的类层次} 常见的系统定义的Java异常如表1所示。

表1 系统定义的运行异常 异常

引起的原因

Array Store Exception 程序试图在数组中存储错误类型的数据

Arithmetic Excepionp 算术错误,如除数为0 Class Not Found Exception 未找到欲装载使用的类

File Not Found Exception 未找到指定的文件或目录 IO Exception 输入、输出错误

Interrupted Fxception 线程在睡眠、等待或因其他原因暂停时被其他线程打断 Malformed URL Exceptio URL格式错误

Null Pointer Exception 引用空的尚无内存空间的对象 Number Format Exception 数据类型不正确

Security Exception 安全性错误,如Applet欲读写文件

Unknown Host Exceptio

无法确定主机的IP地址

2.2 创建自己的异常类

系统定义的异常类主要用来处理系统自己可以预见的运行错误。对于某个应用程序所特有的运行错误,则需要编程人员根据程序的特殊逻辑自己创建用户自定义的异常类和异常对象,来处理程序中特定的逻辑运行错误,为了创建和抛出自定义异常,首先必须先定义一个异常类,通常是从Java的异常类中派生出一个类,例如下面的程序片段:

public class EmptQueueException extends Exception {Queue queue; //创建队列类对象

public EmptQueueException(Queue q)//构造函数 {super(“队列已空”); queue=q; } - 78 -

public String toString();

{return(“队列”+queue.toString()+”已经为空,执行出队操作引发异常”);

} }

3 异常处理机制

JAVA的异常处理是通过5个关键字来实现的:try、catch、finally、throw和throws。Try…catch…finally构成了异常处理器,负责检测、捕获并处理异常;throw语句被称为异常生成器,用来产生异常;如果产生异常的方法不想处理该异常,则在该方法的声明中需使用throws语句将该异常抛向上一级调用方法。

3.1 try-catch-finally语句块

try语句块构造一个异常处理器,封装一些可能抛出或生成异常的语句,从而定义了异常处理器的范围;catch语句块捕捉try语句块抛出的异常,并对捕获到的异常作相应的处理;当try语句块中的某个语句抛出异常时,程序的执行就不再是线性的,跳过某些行,甚至会由于没有与其匹配的catch子句而过早地返回。有时确保一段代码不管是否发生何种异常都被执行到是必要的,关键字finally就是用来标识这样一段代码的。即使程序中没有catch子句,finally语句块也会在执行try语句块的程序前执行,通常使用finally语句块完成清除现场的操作,如关闭打开的文件、关闭网络连接等。下面是异常处理器的基本结构:

try{

//Code that might generate exceptions } catch(Typel id1){

//Hatldle exceptions of Type1 } catch(Type2 id2){ //Handle exceptions of Type2 } catch(Type3 id3){ //Handle exceptions of Type3 } finally{

//Handle in the end }

在使用try-catch-finally时需注意以下事项:

· try语句块不能脱离catch代码块或finally代码块而单独存在。代码块后面至少有一个catch代码块或finally代码块。

· try代码块后面可以有零个或多个catch代码块,可以有零个或至多一个finally代码块。如果catch代码块和finally代码块并存,finally代码块必须在catch代码块后面。

· 当try代码块后面有多个catch代码块,异常一旦被某个catch代码块捕获,接下来的代码块不会再捕获这个异常。因此要求捕获子异常的catch代码块必须在捕获父异常的catch代码块之前。否则将产生编译错误。例如:

张洪波,等:Java的异常处理机制

try{

throw new ArithmeticException(); }

catch(Exception e){}//编译错误 catch(ArithmeticException ae){ System.out.println(ae); }

上述示例代码将产生编译错误,因为Arithmetic Excep- tion异常是Exception异常的子类,必须将捕获子异常的代码块至于捕获父异常的代码块之前。

3.2 生成异常

JAVA语言中,异常或者是由Java虚拟机生成,或者是由Java类库中的某些类生成。事实上,我们在程序中也可以生成自己的异常对象,也就是异常可以不是出错产生,而是人为地抛出。不论哪种方式,生成异常对象都是通过throw instanceException语句来实现的(instance Exception代表欲生成异常类的实例对象)。例如:

class ThrowDemo{

public static void main(String args[]) { try{

throw new ArithmeticException(); }catch(ArithmeticException ae){ System.out.println(ae);} } }

3.3 声明异常

JAVA语言还提供异常处理的堆栈机制。如果方法中的一个语句抛出一个没有在相应的try-catch块中处理的异常,那么这个异常被抛出到调用方法中。如果异常也没有在调用方法中被处理,它就继续抛出到上一级的调用方法中。这个过程一直延续到异常被处理。如果异常到这时还没被处理,它便回到程序入口main()方法。如果main()方法也没有处理异常,那么该异常将异常地中断程序。JAVA程序中就是通过throws关键字来实现这种异常传递的,即如果一个方法不想处理异常。可以在该方法的声明中使用throws语句将异常抛向上级调用方法。例如:

class ThrowsDemo{

void method1(){ try{ method2();

} catch(exception e){ e.printStackTrace();} }

void method2() throws IOException{ method3();}

void method3()throws IOException{ throw new IOException();} public static void main(String[]args){ ThrowsDemo t=new ThrowsDemo(); t.methodl();} }

示例程序中,method3()方法产生了异常,但该方法没有处理异常,而是将异常抛向其上一级调用方法method2(),method2()方法也没有处理异常,它将异常抛向其上一级调用方法method1()。method3()和method2()方法均通过在其方法的声明中使用throws语句来达到异常传递的目的。Method1()方法通过try-catch语句块处理了上传过来的异常。

需要强调的是:对于非运行时异常,程序中要么用try—catch语句块捕获,要么用throws语句声明将它抛出,否则编译不会通过;而对于运行时异常,因为它们具有系统提供的缺省的异常处理程序,所以程序中可以不作处理(当然,必要时,用户可对其处理)。

4 结束语

详细探讨了JAVA语言的异常处理机制。在编制JAVA程序时,如果运用好try、catch、finally、throw和throws,将会在一定程度上提高程序的可读性及稳定性,从而提高程序的质量。

[参考文献]

[1] 飞思科技产品研发中心. JAVA 2应用开发指南[M].北京:

电子工业出版社,2002.

[2] 孙卫琴,李洪成.JAVA 2认证考试指南与试题分析[M].

上海:上海科学技术出版社,2002.

[3] Bruce Eckel. JAVA编程思想[M].北京:机械工业出版社,

2004.

(责任编辑、校对:田敬军)

- 79 -

因篇幅问题不能全部显示,请点此查看更多更全内容