未经检查的异常,如果检查会更好

时间:2012-06-01 21:19:17

标签: java exception language-design api-design effective-java

我意识到已检查异常与Java中未经检查的异常的相对优点有been ample discussion,我不打算重新审视整个辩论。

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

protected Object clone()
            throws CloneNotSupportedException

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

  

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

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

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

编辑:对于那些投票决定将其视为非建设性的人,我想明确表示我不是在寻找意见,辩论,争论或扩展讨论。我也不参加民意调查。相反,我正在寻找能够清楚地分析收益如何超过成本的例子。 (隐含的是承认有成本。)那就是说,我怀疑这个问题的性质是否有可能。我估计Jon Skeet不能这样做,它不可能完成。也许你是对的。如果必须,请关闭。

编辑:虽然我对回复不感兴趣,但我只是因为我的接受率而将此奖励给Jon。

1 个答案:

答案 0 :(得分:13)

是的,很容易:Integer.parseInt抛出NumberFormatException未经检查。

但是,如果您要解析可能不好的数据,那么您一定要考虑捕获异常 - 您很可能会忽略该数据,或者可能会报告并继续进行。它不像Java具有相同的.NET Int32.TryParse,它可以让你轻松地忽略不良数据。基本上你需要知道你需要捕获异常,而不需要激活编译器。 GRR。