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

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

我意识到有 been ample discussion Java 中检查异常与未检查异常的相对优点,我无意重新讨论整个辩论。

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

protected Object clone()
            throws CloneNotSupportedException

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

If the programmer using the API can do no better, an unchecked exception would be more appropriate. One example of an exception that fails this test is CloneNotSupportedException. It is thrown by Object.clone, which should be invoked only on objects that implement Cloneable (Item 11). In practice, the catch block almost always has the character of an assertion failure. The checked nature of the exception provides no benefit to the programmer, but it requires effort and complicates programs.

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

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

编辑:对于那些投票将其视为非建设性的关闭的人,我想明确表示我不是在寻求意见、辩论、争论或扩展讨论。我也不参加投票。相反,我正在寻找对 yield 如何超过成本进行清晰分析的示例引用。 (其中隐含的是承认存在成本。)也就是说,我怀疑这个问题的性质是否使这成为可能。我估计如果 Jon Skeet 做不到,那也不太可能做到。所以也许你是对的。如果必须,请关闭。

编辑:尽管我对回复无动于衷,但我还是会把这个奖励给 Jon,只是为了我的接受率。

最佳答案

是的,很简单:Integer.parseInt抛出未经检查的 NumberFormatException

但是,如果您曾经解析过潜在的坏数据,您绝对应该考虑捕获异常 - 您很可能能够忽略该数据,或者报告它并继续。它不像 Java 有等同于 .NET 的 Int32.TryParse这让您轻松忽略坏数据。基本上你需要知道你需要在没有编译器挑衅的情况下捕获异常。咕噜咕噜

关于java - 未检查的异常,如果检查会更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857505/

相关文章:

C 嵌套开关 : outer switch's case inside inner switch

java - 读取文件中的 int 时出现错误 NoSuchElementException

c# - 用户代码未处理实体异常

Java套接字异常: recv failed

exception - 在 vb.net 中,如何强制退出应用程序并抑制错误消息?

python - 为什么 Python 使用异常来管理迭代器,而其他语言为什么不用呢?

java - 按命名空间属性选择的 XPathExpression 不选择任何内容

java - 在java中将日期或日期字符串设置为日历

java - 为什么在 RecyclerView.Adapter 的 onBindViewHolder 中添加 OnClickListener 被认为是不好的做法?

java - 编写一个简单的解释器,或者找到一个我可以使用的解释器?