16

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

我问这个是因为在我写完之后,Eclipse 编辑器并没有要求我用 try 和 catch 包围这个函数。我认为这就是执行 try 和 catch 的方式。我已经阅读了 Java.com 上的异常处理教程,但我不确定我是否正确理解了关于我的问题的部分。

4

5 回答 5

22

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

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

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

于 2011-03-14T22:13:32.360 回答
4

有两种类型的异常:

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

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

于 2011-03-14T20:32:11.473 回答
2

您需要阅读 Unchecked Exceptions - 从 RuntimeException 继承的异常。它们不需要在方法头中声明。

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

最后一段总结如下:

如果可以合理地期望客户端从异常中恢复,则使其成为受检异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。

于 2011-03-14T20:34:18.133 回答
1

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

因此,我的具体建议是不,不要宣布。当然,你不想被它抓住。在大多数情况下,您也不想扔它,除非这是意外行为。如果方法获得它不喜欢的值是非常正常和合理的,那么异常是处理它的错误方法。

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

于 2011-03-14T20:33:22.130 回答
1

理解异常的第一点是它们是针对异常情况的。在考虑您的方法时,您必须问:“如果传递了异常值,此方法是否应该抛出异常?” 如果答案是“是”,请将其放入您的方法声明中。我不知道你是否明白这个想法,但它有点简单。这只是一个实践问题。

于 2011-03-14T20:34:03.187 回答