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
分享到:
相关推荐
这种错误通常是由于程序在运行时试图替换正在使用的文件。可以在编译前先停止程序。 **74. 使用StreamReader.ReadToEnd()读取文本文件时出现乱码** 如果使用`StreamReader`读取文件时出现乱码,可能是编码设置不...
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获...
这个库包含了C语言运行时所需的函数和数据结构,为许多应用程序提供支持,特别是那些使用Visual C++编译器开发的程序。当你遇到“丢失msvcrt.dll”错误时,意味着你的系统中缺少这个必要的组件,导致某些程序无法...
静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和“易...
对象容器的设计和使用对于构建灵活且可扩展的软件系统至关重要。 #### 三、容器的多态性 **容器的多态性**是指容器能够存储不同类型的对象,并且能够以统一的方式处理这些对象。这是通过向上类型转换(Upcasting)...
Exception是程序运行时的异常情况,可以通过try-catch处理。 第十九,List、Set、Map都继承自Collection接口,但它们各自实现了不同的接口,如List继承自Iterable,Set继承自Collection,Map则不直接继承Collection...
在测试时发现程序死在循环之中,得到的错误记录是"Bus Error"(总线出错),由此可以说明出现了内存操作异常。 经过跟踪变量值发现循环变量i的阀值pSysHead->dbf_count的数值为0xFFFFFFFF,该值是从被破坏的内存...
第十六,常见的运行时异常如NullPointerException、ArrayIndexOutOfBoundsException等,这些异常在程序运行时才会出现。 第十七,error和exception的主要区别在于,error表示系统级错误,如JVM问题,通常无法恢复;...
7. **软件冲突**:禁用或卸载可能引起冲突的第三方软件,尤其是启动时自动运行的程序,可以避免系统启动失败。 8. **注册表清理**:清理注册表中无效或错误的条目,可以提高系统稳定性和性能。 9. **网络连接问题*...
测试错误类型 .......................................................................................................................................... 12 八.测试标准 ....................................
#### 四十七、static属性不被序列化的原因 - **static属性属于类而不是对象实例,因此不在序列化过程中考虑。** #### 四十八、transient关键字的作用 - **transient关键字用于标记对象中不希望被序列化的字段。**...
41. 运行时异常(RuntimeException)是不检查的异常,通常由程序逻辑错误引起,一般不需要进行捕捉处理;一般异常(Checked Exception)是检查型异常,在编译阶段就必须处理。 42. error是系统错误,一般是不可恢复...
exception表示可恢复的异常,程序可以通过适当处理来恢复。 43. Java异常处理机制原理及应用? Java异常处理机制通过try-catch-finally块来捕获和处理异常,使得程序能够稳定运行,避免因异常导致程序崩溃。 44. ...
- **异常**:通常是由于程序错误或者外界因素(如文件不存在)引起的,可以通过编程手段处理。 - **错误**:通常是系统级的问题,很难通过编程手段解决,如内存不足。 #### 十八、List、Set、Map与Collection的关系...
运行时异常通常由程序错误引起,如空指针异常(NullPointerException),不需要显式处理。编译时异常需要在程序中捕获或声明抛出,如输入输出异常(IOException)。 #### 42\. 错误与异常的区分 错误(Error)通常...
### 台达人机界面实用问题集精要解析 #### 硬件篇 **1. 台达的A系列HMI最多有几个通讯口,...警告信息通常不会阻止程序运行,但建议仔细检查这些警告以确保程序质量。遵循软件开发指南修复警告,以提高程序的稳定性。
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 ...