tempad
ReadyGo!技术成就梦想 >>Java >> java语言中异常错误恢复处理的异常类型 (1)

java语言中异常错误恢复处理的异常类型 (1)

ReadyGo!技术成就梦想 网络搜索 efish 2008-9-6 18:00:26

【-IT技术报道】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)); File dstFile = new File((args)); rd = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), args)); wr = new OutputStreamWriter(new FileOutputStream(dstFile), args); // 注意下面这条语句,它有什么问题吗? 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 ”,其中“ must be caught ”上面已经解释了,而后半部分呢?“ declared to be thrown ”是指何意呢?其实指的就是“必须显式地声明某个函数可能会向外部抛出一个异常”,也即是说,如果一个函数内部,它可能抛出了一种类型的异常,但该函数内部并不想(或不宜) catch 并处理这种类型的异常,此时,它就必须使用 throws 关键字来声明该函数可能会向外部抛出一个异常,以便于该函数的调用者知晓并能够及时处理这种类型的异常。下面列出了这几种情况的比较,代码如下:

// 示例程序 1 ,这种写法能够编译通过 package com.ginger.exception; import java.io.*; public class Trans { public static void main(String args) { try { test(); } // 虽然这里能够捕获到 Exception 类型的异常 catch (Exception ex) { ex.printStackTrace(); } } static void test() { throw new Exception("test"); } }

// 示例程序 3 ,这种写法又能够被编译通过 import java.io.*; public class Trans { public static void main(String args) { try { // 虽然 test() 函数并没有真正抛出一个 Exception 类型的异常 // 但是由于它函数声明时,表示它可能抛出一个 Exception 类型的异常 // 所以,这里仍然不能被编译通过。 // 呵呵!体会到了 Java 异常处理模型的严谨吧! test(); } catch(IOException ex) { ex.printStackTrace(); } } static void test() throws Exception { } }

1 2 >>

[1]  [2]  上一页  下一页
责任编辑: efish 参与评论 查找更多:
相关文章
教你如何妙用EditPlus 配置Java编译环境 教你如何妙用EditPlus 配置Java编译环境
JAVA和.NET两个平台对于安全功能的比较 (1) JAVA和.NET两个平台对于安全功能的比较 (1)
一个优秀Java程序员必须了解的GC工作原理 一个优秀Java程序员必须了解的GC工作原理
Java课堂:初学者都必须理解的几个问题 (1) Java课堂:初学者都必须理解的几个问题 (1)
Web开发正确方向 Javascript是一个错误吗? Web开发正确方向 Javascript是一个错误吗?
Firefox浏览器兼容Javascript脚本的方法 Firefox浏览器兼容Javascript脚本的方法
JS技巧:在IE浏览器中正确显示PNG透明图片 JS技巧:在IE浏览器中正确显示PNG透明图片
基础知识:Java Web三层架构的配置详解 基础知识:Java Web三层架构的配置详解
Sun预计年底之前将公开全部Java源代码 Sun预计年底之前将公开全部Java源代码
区分Tomcat与Web服务器、应用服务器的关系 区分Tomcat与Web服务器、应用服务器的关系
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想