java 语言中异常错误恢复处理的异常类型 Java 语言要求 java 程序中(无论是谁写的代码)所有抛出(throw)的异常都必须是从 Throwable 派生而来。当然,实际的 Java 编程中,由于 JDK 平台已经为我们设计好了非常丰富和完整的异常对 象分类模型。因此,java 程序员一般是不需要再重新定义自己的异常对象。而且即便是需要扩展自定 义的异常对象,也往往会从 Exception 派生而来。所以,对于 java 程序员而言,它一般只需要在它的 顶 级 函 数 中 catch(Exception ex) 就 可 以 捕 获 出 所 有 的 异 常 对 象 。 所 有 异 常 对 象 的 根 基 类 是 Throwable ,Throwable 从 Object 直接继承而来(这是 java 系统所强制要求的) ,并且它实现了 。从 Serializable 接口(这为所有的异常对象都能够轻松跨越 Java 组件系统做好了最充分的物质准备) Throwable 直接派生出的异常类有 Exception 和 Error 。Exception 是 java 程序员所最熟悉的,它一般 代表了真正实际意义上的异常对象的根基类。也即是说, Exception 和从它派生而来的所有异常都是 应用程序能够 catch 到的,并且可以进行异常错误恢复处理的异常类型。而 Error 则表示 Java 系统中 出现了一个非常严重的异常错误,并且这个错误可能是应用程序所不能恢复的,例如 LinkageError , 或 ThreadDeath 等。 首先还是看一个例子吧!代码如下: import java.io.*; public class Trans { public static void main(String[] args) { try { BufferedReader rd=null; Writer wr=null; try { File srcFile = new File((args[0])); File dstFile = new File((args[1])); rd = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), args[2])); wr = new OutputStreamWriter(new FileOutputStream(dstFile), args[3]); // 注意下面这条语句,它有什么问题吗? if (rd == null || wr == null) throw new Exception("error! test!"); while(true) { String sLine = rd.readLine(); if(sLine == null) break; wr.write(sLine); wr.write("\r\n"); } } finally { wr.flush(); wr.close(); rd.close(); } } catch(IOException ex) {
ex.printStackTrace(); } } } 熟悉 java 语言的程序员朋友们, 你们认为上面的程序有什么
问题吗?编译能通过吗?如果不能, 那么原因又是为何呢?好了,有了自己的分析和预期之后,不妨亲自动手编译一下上面的小程序,呵 呵!结果确实如您所料?是的,的确是编译时报错了,错误信息如下: E:\Trans.java:20: unreported exception java.lang.Exception; must be caught or declared to be thrown if (rd == null || wr == null) throw new Exception("error! test!"); 1 error 上面这种编译错误信息,相信 Java 程序员肯定见过(可能还是屡见不鲜!! ) 相信老练一些的 Java 程序员一定非常清楚上述编译出错的原因。 那就是如错误信息中“ must be ( caught ”
)描述的那样, 在 Java 的异常处理模型中,要求所有被抛出的异常都必须要有对应的“异 常处理模块” 。也即是说,如果你在程序中 throw 出一个异常,那么在你的程序中(函数中)就必 须要 catch 这个异常(处理这个异常) 。例如上面的例子中,你在第 20 行代码处,抛出了一个 Exception 类型的异常,但是在该函数中,却没有 catch 并处理掉此异常的地方。因此,这样的程序 即便是能够编译通过,那么运行时也是致命的(可能导致程序的崩溃) ,所以, Java 语言干脆在编译 时就尽可能地检查(并卡住)这种本不应该出现的错误,这无疑对提高
程序的可靠性大有帮助。 但是,在 Java 语言中,这就是必须的。 如果一个函数中,它运行时可能会向上层调用者函数抛 出一个异常,那么,它就必须在该函数的声明中显式的注明(采用 throws 关键字) 。还记得刚才那 条编译错误信息吗?“ must be caught or declared to be thrown ” ,其