基本上,Rod Johnson 对Checked Exception没有好感,一个原因是降低代码可读性,另一个原因是大部分针对Checked Exception的catch都没有用处。
SUN认为,“checked exceptions should be the norm. Runtime exceptions indicate programming errors.”
Rod说他并不完全买账,随后列举了自己的一些实践。但我觉得,他自己的实践,跟SUN的官方意见基本上是一致的:
Checked Exception应该代表一种业务异常,可以视为一个方法的“第二输出”。一个典型的例子就是“系统检测到取款金额大于帐户余额”。
而Runtime Exception 应该用于代表非业务的、并且Caller没办法对付的异常。举例来说,如果一个方法检测到取款金额大于帐户余额,这个方法的调用者就应该catch这个异常,并采用相应的业务策略来处理,这类异常应该是Checked Exception;但如果一个方法仅仅是检测到数据库连不上,Caller对数据库异常也没啥办法,catch它也没有任何意义 –>既然没有意义,就不要浪费代码去处理它 –>所以干脆就把这类异常做成Runtime Exception.
但是另有一个要点就是:
对Runtime Exception一定要在方法的签名处进行注释,这样Caller才知道此方法可能会抛RuntimeException,这样它就可以自己决定是否要catch这类Exception. 因为有时从健壮性或者其他因素考虑,这种catch还是有必要的。