版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
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 学习笔记】系列连载专题请见: