10

我意识到已经 Java 中已检查异常与未检查异常的相对优点进行了充分的 讨论,我无意重新讨论整个辩论。

相反,我想问一个我在阅读 Joshua Bloch 的 Effective Java, 2nd Edition 时想到的一个非常具体的问题。在阅读的过程中,我注意到在 Item 59(“避免不必要地使用受检异常”)中,Joshua 在 Java API 中给出了一个使用受检异常的示例。具体来说,在Object

protected Object clone()
            throws CloneNotSupportedException

...然后争辩说它应该是一个未经检查的异常。

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

然后我看看他是否有相反的例子,但我找不到。

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

编辑: 对于那些投票以非建设性的方式结束这一点的人,我想明确表示我不是在寻找意见、辩论、争论或扩展讨论。我也没有进行民意调查。相反,我正在寻找可以对收益如何超过成本进行清晰分析的示例参考。(其中隐含的是承认有成本。)也就是说,我怀疑这个问题的性质是否使这成为可能。我认为如果 Jon Skeet 做不到,那也不太可能做到。所以也许你是对的。如果必须关闭。

编辑:虽然我对回应不为所动,但我将把这个奖励给乔恩只是为了我的接受率。

4

1 回答 1

13

是的,很容易:Integer.parseIntthrowsNumberFormatException未经检查。

但是,如果您曾经解析过可能存在错误的数据,那么您绝对应该考虑捕获异常——您很可能能够忽略该数据,或者报告它并继续前进。它不像 Java 有 .NET 的等价物,Int32.TryParse它可以让您轻松忽略不良数据。基本上你需要知道你需要捕获异常,而不需要编译器的挑衅。Grr。

于 2012-06-01T21:24:51.777 回答