我正在构建一个包含大量计算的科学软件,当然参数可能有不正确的长度等...所以我使用IllegalArgumentException
类,因为它似乎是问题的正确名称,但是我应该放{ {1}}在函数定义?
我问这个是因为在我写完之后,Eclipse编辑器没有让我用try和catch来包围这个函数。我认为这是如何实施尝试和捕获。我已经阅读了Java.com上的异常处理教程,但我不确定我是否理解了有关我的问题的部分。
答案 0 :(得分:18)
RuntimeException
这样的{p> IllegalArgumentException
用于指示编程错误。程序本身应该很少能够处理它。有人需要手动修复代码。
潜在的RuntimeException
应该以某种方式记录在函数契约中(即javadoc),或者使用显式@throws
,或者在描述输入时。如果你没有函数的javadoc,你可能想要添加throws子句只是为了记录使用函数的潜在缺陷,但是通常不鼓励为运行时异常添加throws子句。
如果给出错误的长度实际上不是编程错误,但是异常情况,我会创建一个新的已检查异常(例如BadLengthError)。如果不是特殊情况,请不要使用异常进行流量控制。
答案 1 :(得分:4)
有两种类型的例外:
运行时异常(例如IllegalArgumentException和NullPointerException)不需要显式捕获,因为它们“不应该发生”。当他们这样做时,你需要在某个地方处理它们。
常规异常需要被捕获或声明被抛出,因为它们代表了一种更本质上更难的错误。
答案 2 :(得分:2)
您需要阅读Unchecked Exceptions - 从RuntimeException继承的异常。它们不需要在方法头中声明。
http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
最后一段总结了:
如果可以合理地预期客户 从异常中恢复,成功 检查的例外。如果是客户 无法从中恢复过来 例外,让它不受控制 异常。
答案 3 :(得分:1)
IllegalArgumentException
(以及其他一些人,例如NullPointerException
)是RuntimeException
的示例。此类异常不是所谓的已检查异常。 Java要求方法声明它们抛出哪些已检查的异常,并且如果被调用的方法可能抛出已检查的异常,则调用方法应该声明它自己抛出异常,或者捕获并处理它。
因此,我的具体建议是否定的,不要声明。当然,你可能不想抓住它。在大多数情况下,您也不希望将其抛出,除非这是意外行为。如果方法获得它不喜欢的值是非常正常和合理的,那么异常是处理它的错误方法。
您可能还想考虑使用断言。
答案 4 :(得分:1)
理解异常时的第一点是它们适用于特殊情况。在考虑你的方法时,你必须问:“如果传递一个特殊值,这个方法是否会引发异常?”如果答案为“是”,请将其放在方法声明中。 我不知道你是否明白了,但这很简单。这只是一个练习问题。