可能重复:
何时选择已检查和未检查的异常
我应该何时创建一个已检查的异常,何时应该生成运行时异常?
例如,假设我创建了以下类:
public class Account {
private float balance;
/* ... constructor, getter, and other fields and methods */
public void transferTo(Account other, float amount) {
if (amount > balance)
throw new NotEnoughBalanceException();
/* ... */
}
}
Run Code Online (Sandbox Code Playgroud)
我应该如何创建我的NotEnoughBalanceException?它应该延伸Exception还是RuntimeException?或者我应该使用IllegalArgumentException?
我意识到已经 充分 讨论了检查异常与Java中未经检查的异常的相对优点,我不打算重新审视整个辩论.
相反,当我阅读Joshua Bloch的Effective Java,第2版时,我想问一个非常具体的问题.在我阅读时,我注意到在第59项("避免不必要地使用已检查的异常")中,Joshua在Java API中给出了一个使用已检查异常的示例.具体来说,在Object:
protected Object clone()
throws CloneNotSupportedException
Run Code Online (Sandbox Code Playgroud)
...然后争辩说它应该是一个未经检查的例外.
如果使用API的程序员不能做得更好,那么未经检查的异常会更合适.未通过此测试的异常的一个示例是CloneNotSupportedException.它由Object.clone引发,只应在实现Cloneable(Item 11)的对象上调用它.实际上,catch块几乎总是具有断言失败的特征.异常的检查性质对程序员没有任何好处,但它需要努力并使程序复杂化.
然后我看着他是否有一个反向的例子,但我找不到一个.
所以我想问一下是否有人可以在Java中提供一个使用未经检查的异常的API示例,但是检查异常是更好的选择,并解释原因.一个现实世界的例子会更可取,但如果能够说明问题的话,我愿意接受一个人为的例子.
编辑: 对于那些投票决定将其视为非建设性的人,我想明确表示我不是在寻找意见,辩论,争论或扩展讨论.我也不参加民意调查.相反,我正在寻找能够清楚地分析收益如何超过成本的例子.(隐含的是承认有成本.)那就是说,我怀疑这个问题的性质是否有可能.我估计Jon Skeet不能这样做,它不可能完成.也许你是对的.如果必须,请关闭.
编辑:虽然我对这个回复不感兴趣,但我只是因为我的接受率而将此奖励给Jon.
为什么运行时异常UnChecked是有意义的(而不是如果它们被检查)?
我最近一直在做一些纯Java开发,我正在使用一个暴露少量方法的外部库,每个方法都有可能抛出一个Exception.
Eclipse不会让我编译我的程序,除非我将每个调用包装在一个try-catch块中.到目前为止,没什么大不了的.
然后我注意到了一些东西,比如ArrayList.add()抛出的东西IndexOutOfBoundsException.我怎么称呼这样的东西而不需要把它包裹起来try..catch呢?Obv,在这种特殊情况下,如果每次都必须这样做,那将是非常恼人的,但是try-catch在某些情况下是如何以及为什么强制实施的,而不是其他情况?