我应该在函数中抛出IllegalArgumentException吗?

我正在构建一个包含大量计算的科学软件,当然参数可能有错误的长度等…所以我使用了IllegalArgumentException类,因为它似乎是问题的正确名称,但是我应该在函数定义中throws IllegalArgumentException吗?

我问这个是因为在我写完之后,Eclipse编辑器没有让我用try和catch来包围这个函数。 我认为这是强制执行尝试和捕获的方式。 我已经阅读了Java.com上的exception处理教程,但我不确定我是否理解了有关我的问题的部分。

IllegalArgumentException类似的RuntimeException用于指示编程错误 。 程序本身应该很少能够处理它。 有人需要手动修复代码。

潜在的RuntimeException应该在函数契约(即javadoc)中以某种方式记录,或者使用显式的@throws ,或者在描述输入时记录。 如果您没有该函数的javadoc,您可能希望添加throws子句只是为了记录使用该函数的潜在缺陷,但通常不鼓励为运行时exception添加throws子句。

如果给出错误的长度实际上不是编程错误,但是exception情况,我会创建一个新的已检查exception(例如BadLengthError)。 如果不是特殊情况,请不要使用exception进行流量控制。

有两种类型的例外:

运行时exception(例如IllegalArgumentException和NullPointerException)不需要显式捕获,因为它们“不应该发生”。 当他们这样做时,你需要在某个地方处理它们。

常规exception需要被捕获或声明被抛出,因为它们代表了一种更本质上更难的错误。

您需要阅读Unchecked Exceptions – 从RuntimeExceptioninheritance的exception。 它们不需要在方法头中声明。

http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

最后一段总结如下:

如果可以合理地期望客户端从exception中恢复,请将其作为已检查的exception。 如果客户端无法执行任何操作以从exception中恢复,请将其设置为未经检查的exception。

IllegalArgumentException (以及其他一些例子,例如NullPointerException )是RuntimeException示例。 这种类型的exception不是所谓的已检查exception 。 Java要求方法声明它们抛出哪些已检查的exception,并且如果被调用的方法可能抛出已检查的exception,则调用方法应该声明它自己抛出exception,或者捕获并处理它。

因此,我的具体建议是否定的,不要声明。 但是,当然,你不想抓住它。 在大多数情况下, 除非这是意外行为, 否则您也不想抛弃它。 如果方法获得它不喜欢的值是非常正常和合理的,则exception是处理它的错误方法。

您可能还想考虑使用断言。

理解exception时的第一点是它们适用于特殊情况。 在考虑你的方法时,你必须问:“如果传递一个特殊值,这个方法是否会引发exception?” 如果答案为“是”,请将其放在方法声明中。 我不知道你是否明白了,但这很简单。 这只是一个练习问题。