第71条 避免不必要地使用受检异常
-
抛出受检异常的方法无法直接在流中使用
-
消除受检异常的最简单方法是返回所需结果类型的
Optional
-
可以使用判断的方式消除异常
try { obj.action(args); } catch (TheCheckedException e) { ... // Handle exceptional condition }
if (obj.actionPermitted(args)) { obj.action(args); } else { ... // Handle exceptional condition }
虽然后者的调用序列没有前者的漂亮,但是这样得到的 API 更加灵活
-
如果调用者无法从失败的执行情况恢复,则抛出未受检异常。如果可能恢复至正常状态,并且希望强制调用者处理异常情况,首先考虑返回
Optional
。只有在失败的情况下提供的信息不足时才应该抛出一个受检异常
思考
- 直接抛出异常最大的优势就是可以跨越很多层直接传输异常。比如可能最外层向里调用了5层函数才走到了数据校验没有通过的状态(正常来说肯定简单的校验可以直接在最外层做,比如DB、网络访问外部接口这些可能是在底层执行的过程中发现数据不对了),这个时候如果想要把当前的异常状态返回给最外层,要跨越5层,而如果是抛异常,就可以直接在最外层进行
trt-catch
- 如果数据有问题没有必要返回
null
,如果肯定会在后面发生空指针,应该尽早的抛出,这样可以给后面查问题提供一点便利性
网友评论