2

我有一些代码将字符串(用户输入)拆分为一个数组,并将该数组的元素作为参数传递给一个方法。如果数组没有足够的元素,则会自动抛出 ArrayIndexOutOfBoundsException。但是,这是一个未经检查的异常,由于这是用户输入不正确的问题,我可以改为事先检查此条件并抛出一个检查异常。

所以,我有几个问题:

  1. 处理未经检查的异常或抛出已检查的异常会更好吗?
  2. 如果我确实抛出了一个检查异常,我应该使用 IllegalArgumentException 吗?我的理解是它适用于非法参数类型,而不是非法数量的参数。

谢谢。

4

7 回答 7

3

已检查异常是编译器强制您处理的异常,而未检查异常则不是这种情况。现在,根据您的问题,您的代码应该以一种方式编写,以免出现任何情况,从而引发未经检查的异常(例如:-空指针异常,ArrayIndexOutOfBoundsException)。

如果您的代码抛出未经检查的异常,则代码中存在问题。正如您在您的案例中指出的那样,输入数据不正确,那么理想情况下,您应该对输入进行验证,无论其是否是预期的,并给出错误消息,因此不需要将未经检查的异常转换为已检查的异常

因此,在理想世界中,无需将未经检查的异常转换为已检查的异常。是的,如果有特定情况,我们可以在技术上做到这一点。

于 2013-04-13T03:20:25.453 回答
2

处理未经检查的异常或抛出已检查的异常会更好吗?

最好抛出一个检查异常,表明用户输入有问题。应保留未经检查的异常以指示不更改代码就无法恢复的编程问题;用户输入不是这些问题之一。

如果我确实抛出了一个检查异常,我应该使用 IllegalArgumentException 吗?我的理解是它适用于非法参数类型,而不是非法数量的参数。

如果您的设计约束允许您使用特定于应用程序的异常,请针对无效用户输入的情况设计一种。这将使使用您的 API 的代码看起来更明确地了解它所期望的异常。

于 2013-04-13T03:20:35.527 回答
2

如果您有办法重新提示用户正确输入,即如果有处理异常的合乎逻辑的方法,那么就这样做。如果您期望调用堆栈更远的人来处理异常,那么抛出一个检查异常。如果您只是放弃,那么让未经检查的异常通过(或将其重新打包在一个信息更丰富的 RuntimeException 中,以便最终捕获它的任何记录器)。这是针对所有例外情况的一般建议。(此外,不要记录异常并重新抛出它 - 要么记录它,要么重新抛出它,而不是两者兼而有之。)

于 2013-04-13T03:21:29.197 回答
2
Would it be better form to handle the unchecked exception or throw a checked one?

最好在尝试处理输入之前验证输入,如果输入无效,请用户再试一次。

于 2013-04-13T03:33:55.257 回答
1

基本上,当您决定处理运行时异常时,在您的情况下,ArrayIndexBoundofExcepgtion,您可能会继续进行而不会突然中断应用程序。

因此,如果您的数组没有足够的数据,该做什么或不做什么是您的业务决策。如果它确实影响了业务数据流,最好处理一个已检查的异常,以便您可以清理您的输入数据。

于 2013-04-13T03:29:55.583 回答
1

处理未经检查的异常或抛出已检查的异常会更好吗?

抛出未经检查的异常。你总是可以赶上RuntimeException并继续前进。然后我又偏向于未经检查的异常,因为我不喜欢所有检查的异常。

如果我确实抛出了一个检查异常,我应该使用 IllegalArgumentException 吗?

是的,它应该按照下面的 javadoc 报价进行。如果您想传达更具体的内容,您可以创建自己的检查异常。这取决于您的设计。

抛出以指示方法已传递了非法或不适当的参数。

于 2013-04-13T03:31:54.427 回答
1

我建议避免检查异常。有关一些支持论点,请参见以下内容:

您是定义自己的类扩展RuntimeException并抛出它还是简单地允许ArrayIndexOutOfBoundsException抛出它取决于上下文。一般来说,后者就足够了。

于 2013-04-13T03:52:19.257 回答