`
TonyLian
  • 浏览: 396640 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【第40条】对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常

阅读更多

    Java一共有三种可抛出的东东(trhowable):被检查的异常(checkedException),运行时异常(runtimeException),错误(error)。我们最常见的是前两者,但是什么时候该使用哪种异常,可能是一件非常让人头疼的事情。为此,搜索“checkedException runtimeException”关键字,可以得到不少的讲解,比如我收藏的这一篇:http://thomaslee007.iteye.com/blog/151134

 

    其实,什么时候该用哪一个,在本条的题目中就已经做出了非常精辟的回答。如果希望使用者可以恢复,继续执行程序,应该使用checkedException;而如果是程序错误,遇到这个错误后顶多是写个日志、报告个MessageBox,就只能停止程序,就应该使用runtimeException。

 

    以上讲的是判断该使用哪一类异常的依据,或者说是“定义”。而下面讲的则是checkedException和runtimeException在表现上的区别,或者说是“特征”。而有些人可能会用这些特征来当做定义,这是错误的,这里并不是先有鸡还是先有蛋的问题。而是,使用场景决定了使用哪种异常,而使用哪种异常才能表现出如下哪种特征。

 

    这个“特征”就是,是否在调用方法时必须俘获它可能抛出的异常。对于checkedException是必须的,而对于runtimeException是不强求的。同样,在方法的描述中对可能抛出的checkedException要求用throws关键字予以明示,而runtimeException则不需要。但,请切记,这两点区别,只是两者表现出来的不同特征。而绝不是以要不要写某些代码来决定使用哪种异常的

 

    以上这些可能是本书中“仅仅适用于Java”最为突出的一条。(其他内容,都或多或少地也适用于其他面向对象的语言)

 

    说到Java对Exceptin的设计,在这一点上至少 .Net 的设计团队就有着不少的不同看法。Java对checkedException的要求(必须在方法声明中明示,调用方必须try-catch)在带来好处(给所有的可检查的异常以规划良好的处理、思路清晰方便调试、在没有文档的情况下也可以很好的了解方法可能抛出的异常 等等)的同时,也带来了弊端(写法比较复杂、try-catch块使缩进加深、默认情况下程序中必须处理掉所有的checkedException 等等)。于是 .Net 的设计团队“另辟蹊径”(之所以加引号,是因为它们的本质还是一样的),创造了现在我们在.Net中看到的Exception,它是“随心所欲”的,尤其是对于初学者,它的简单,甚至可以不必在意的特点也广收欢迎。或许可以理解为“.Net中的Exception都是Java中的RuntimeException”(我不知道我这种理解或是比喻是否有问题),总之.Net是以放低对严谨性、调试便利性的要求,而换来简单易用的优势。但是,还有一点就是在没有文档的情况下无法获知你将要调用的方法都会抛出哪些异常。虽然MSDN做的很好,但是,我们自己写的API呢?只顾代码,不顾文档的“懒人”们可要注意了。

 

    扯远了,更多这方面的比较请参考网络吧。

 

 

 

【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208

 

2
0
分享到:
评论

相关推荐

    易语言程序免安装版下载

    静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和“易...

    超级有影响力霸气的Java面试题大全文档

     异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获...

    华为编程开发规范与案例

    在测试时发现程序死在循环之中,得到的错误记录是"Bus Error"(总线出错),由此可以说明出现了内存操作异常。 经过跟踪变量值发现循环变量i的阀值pSysHead->dbf_count的数值为0xFFFFFFFF,该值是从被破坏的内存...

    软件测试规范

    测试错误类型 .......................................................................................................................................... 12 八.测试标准 ....................................

    Delphi5开发人员指南

    7.5 在应用程序中使用ActiveX控件 153 7.6 发布带有ActiveX控件的应用程序 154 7.7 注册ActiveX控件 155 7.8 BlackJack:一个OCX示范程序 155 7.8.1 纸牌 155 7.8.2 游戏 157 7.8.3 调用ActiveX控件的方法 165 7.9 ...

    java 面试题 总结

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的...

    JAVA面试题最全集

    被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,...

    asp.net知识库

    将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005 ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    《你必须知道的495个C语言问题》

    1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 15 1.29 为什么我的编译器不允许我定义大数组,如double array[256][256]? 15 命名空间 15 1.30 如何判断哪些标识符可以使用,...

    Oracle 10g 开发与管理

    第四讲 SQL基本查询 31 一. SQL语句概述 31 1. SQL简介 31 2. SQL分类 31 3. PL/SQL (Procedure Language) 31 二. SQL*Plus 31 1.启动 SQL*Plus 单行编辑 31 2.启动iSQL*Plus 多行编辑 31 3.退出 32  直接关闭 ...

    深入解析Windows操作系统中文.part2.rar

    对可恢复文件系统的支持 658 11.2 缓存的虚拟内存管理 660 11.3 缓存的大小 662 LargeSystemCache 662 缓存的虚拟大小 663 缓存的工作集大小 665 缓存的物理大小 667 11.4 缓存的数据结构 668 系统范围的缓存数据...

    RED HAT LINUX 6大全

    第四部分为Linux编程;第五部分为附录。本书内容翔实、涉及领域广泛,并且提供了详细的例子和大量的参考资料(包括书籍、电子文档和Internet站点),是一本学习、使用和管理Linux不可多得的好书。 目 录 译者序 前言...

    会计理论考试题

    A、不可恢复 B、可以在“回收站”中找到 C、可以恢复 D、可以在“我的公文包”中找到 15.下列软件中不属于系统软件的是 ___D__ 。 A、Windows B、Visual FoxPro C、UCDOS D、WPS97 16.应用软件在计算机普及中起重要...

Global site tag (gtag.js) - Google Analytics