Java 未经检查的异常,该异常会比已检查的异常更好

Java 未经检查的异常,该异常会比已检查的异常更好,java,exception,language-design,api-design,effective-java,Java,Exception,Language Design,Api Design,Effective Java,我意识到在Java中,检查异常与未检查异常有许多相对的优点,我不打算重温整个辩论 相反,我想问一个非常具体的问题,这是我在阅读Joshua Bloch的《有效Java》第二版时想到的。在阅读时,我注意到在第59项(“避免不必要地使用检查异常”)中,Joshua给出了Java API中使用检查异常的示例。具体而言,在对象中: protected Object clone() throws CloneNotSupportedException …然后辩称这应该是一个未经检查

我意识到在Java中,检查异常与未检查异常有许多相对的优点,我不打算重温整个辩论

相反,我想问一个非常具体的问题,这是我在阅读Joshua Bloch的《有效Java》第二版时想到的。在阅读时,我注意到在第59项(“避免不必要地使用检查异常”)中,Joshua给出了Java API中使用检查异常的示例。具体而言,在
对象中

protected Object clone()
            throws CloneNotSupportedException
…然后辩称这应该是一个未经检查的例外

如果使用API的程序员不能做得更好,那么一个未检查的异常将更合适。无法通过此测试的异常的一个示例是CloneNotSupportedException。它由Object.clone抛出,只应在实现可克隆的对象上调用它(第11项)。实际上,catch块几乎总是具有断言失败的特征。异常的检查性质对程序员没有任何好处,但它需要付出努力并使程序复杂化

然后我看他是否有匡威的例子,但我找不到

所以我想问一下,是否有人可以给出一个Java中使用未检查异常的示例API,但其中检查异常是更好的选择,并解释原因。一个真实世界的例子会更好,但我愿意接受一个人为的例子,如果这也能说明问题的话

编辑:对于那些投票以非建设性方式结束本次会议的人,我想明确表示,我不是在寻求意见、辩论、争论或长期讨论。我也不参加投票。相反,我在寻找一些例子的参考资料,这些例子可以清楚地分析收益如何大于成本。(这意味着承认存在成本。)尽管如此,我对这个问题的性质是否使这成为可能持怀疑态度。我想如果乔恩·斯基特做不到,那就不太可能做到。也许你是对的。如果必须的话,关上

编辑:虽然我对这个回复不感兴趣,但我会把这个奖励给Jon,仅仅是因为我的接受率。

是的,很容易:抛出未选中的
NumberFormatException


但是,如果你一直在解析潜在的坏数据,你一定要考虑捕获异常——你很可能忽略这些数据,或者报告它并继续前进。它不像Java有一个.NET的等价物,它可以让你轻易地忽略坏数据。基本上,您需要知道您需要捕获异常,而不需要编译器的刺激。Grr.

我完全同意。当您编码并进入“区域”时,很容易错过等待弹出并喊出“pwn3d!”的特定异常,因为您忘记捕捉它,或者因为您不知道您可能需要捕捉它…谢谢您的快速回复,Jon。你选择了一个我不在乎的例子。我很满意JavaDoc中提到了这个异常,我也很感激允许我选择处理问题的范围。你认为每个例子都会有相同的权衡吗?@pohl:假设你在一个方法中调用
Integer.parseInt
,但忘记捕获或声明它。此时,该方法的任何调用方都不知道会发生什么。对那种情况还满意吗?好问题。我相信我会为交付一个糟糕的产品而感到难过。我想,如果将此作为一个检查异常完全免除了我对不良输入的健壮性负担,那么我会发现这条思路很有说服力。不过,我认为没有。你的例子很好,至少让我有点犹豫。arithmetricexception()将是另一个类似的例子。