快速业务通道

java异常处理笔记 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
错误信息,相信 Java 程序员肯定见过(可能还是屡见不鲜!),而且,这也是许多从 C++ 程序员刚刚转来写 Java 程序不久(还没有真正入行)时,最感到迷糊和不解的地方,“俺代码明明没什么问题吗?可为什么编译有问题呢”!

呵呵!阿愚相信老练一些的 Java 程序员一定非常清楚上述编译出错的原因。那就是如错误信息中(“ must be caught ”)描述的那样,在 Java 的异常处理模型中,要求所有被抛出的异常都必须要有对应的“异常处理模块” 。也即是说,如果你在程序中 throw 出一个异常,那么在你的程序中(函数中)就必须要 catch 这个异常(处理这个异常)。例如上面的例子中,你在第 20 行代码处,抛出了一个 Exception 类型的异常,但是在该函数中,却没有 catch 并处理掉此异常的地方。因此,这样的程序即便是能够编译通过,那么运行时也是致命的(可能导致程序的崩溃),所以,Java 语言干脆在编译时就尽可能地检查(并卡住)这种本不应该出现的错误,这无疑对提高程序的可靠性大有帮助。相反,C++ 中则不是这样,它把更多的事情和责任交给 C++ 程序员去完成,它总相信 C++ 程序员是最优秀的,会自己处理好这一切的所有事情。如果程序中真的出现了未被捕获的异常,系统它(实际上是 C++ 运行库中)就认为这是出现了一个致命的、不可恢复的错误,接着调用 terminate 函数终止该进程( NT 系统中稍微负责任一些,还弹出个“系统错误”对华框,并且 report 出一些与异常相关的错误信息)。

从上面的分析可以看出,Java 异常处理模型的确比 C++ 异常处理模型更严谨和更安全。实际上,这还体现在更多的方面,例如,在 C++ 异常处理模型中,异常的声明已经可以成为声明函数接口的一部分,但这并非语言所强求的。虽然许多优秀的库系统在设计时,都把这当成了一种必须的约定,甚至是编程规范,例如 MFC 中,就有许多可能抛出异常的函数,都显式地做了声明,如 CFile::Read 函数,声明如下:

virtual UINT Read( void* lpBuf , UINT nCount );

throw( CFileException );

但是,在 Java 语言中,这就是必须的。 如果一个函数中,它运行时可能会向上层调用者函数抛出一个异常,那么,它就必须在该函数的声明中显式的注明(采用 throws 关键字,语法与 C++ 类似) 。还记得刚才那条编译错误信息吗?“ must be caught or declared to be thrown ”,其中“ must be caught ”上面已经解释了,而后半部分呢?“ declared to be thrown ”是指何意呢?其实指的就是“必须显式地声明某个函数可能会向外部抛出一个异常”,也即是说,如果一个函数内部,它可能抛出了一种类型的异常,但该函数内部并不想(或不宜) catch 并处理这种类型的异常,此时,它就必须( 注意,这是必须的!强求的!而 C++ 中则不是必须的 )使用 throws 关键字来声明该函数可能会向外部抛出一个异常,以便于该函数的调用者知晓并能够及时处理这种类型的异常。下面列出了这几种情况的比较,代码如下:

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号