1.运行时异常与有效性检查相关
以前一直认为运行时异常是可以捕获并恢复的。比如IllegalArgumentException,比如客户端代码在捕获之后,可以重新传一个符合约束的参数去调用API(这样的客户端代码是不很傻)。如果这样理解,很容易把受检异常与运行时异常混淆。因为受检异常的一个显著的特
点就是用户可以捕获并”恢复“。 运行时异常出现的场景:前提违例,也就是client代码没有按照API的约束去调用。约束类似于人们做生意的合同。约定输入什么,返回什么。 “约束”经常出现在构造方法或者readObject(另类的构造方法)中。最常见的参数的有效性检查也是约束的一种情况。
2.受检异常可”恢复“的理解
通常只有受检异常是认为客户端可以尝试去捕获做一些场景的恢复或相关的有益的处理。比如通过读取一个文件初始化一些属性值,如果报FileNotFoundException,那么客户端捕获之后,可以尝试其它方式或者其它文件或者使用类中定义的静态值去初始化。
又比如用户通过网银支付,当抛出余额不足的异常时,可以调用查询的API来显示余额还有多少。这虽然不是恢复,但是可以看做对受检异常的一种有益的处理。
由于受检异常也是API的一种返回值这个特性决定了用户必须做一些有效的处理,比如catch或re throw,从而表明客户在调用API的时候,已经清楚了异常也是一种返回。