Java:捕获未检查的vs.检查的



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

我有几个问题:

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

谢谢。

受控异常是编译器强制您处理的异常,而非非检查异常。现在根据你的问题,你的代码应该以一种方式编写,这样就不会出现未经检查的异常(例如:-空指针异常,ArrayIndexOutOfBoundsException)。

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

因此,在理想情况下,没有必要将未检查异常转换为已检查异常。是的,如果有特殊情况的话,技术上我们可以这样做。

是处理未检查的异常还是抛出已检查的异常更好?

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

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

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

如果你有办法重新提示用户输入正确的内容,也就是说,如果有一个逻辑的方法来处理异常,那么就这样做。如果您希望调用堆栈更上层的某个人处理异常,那么抛出一个检查异常。如果您只是放弃,那么让未检查的异常通过(或者将其重新打包在一个更有信息的RuntimeException中,以便最终捕获它的记录器受益)。这是对所有例外情况的一般建议。(另外,不要记录一个异常并重新抛出它——要么记录它,要么重新抛出它,而不是同时进行。)

Would it be better form to handle the unchecked exception or throw a checked one?

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

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

所以这是你的业务决策,做什么或不,如果你的数组没有足够的数据。如果它确实影响了业务数据流,那么最好处理一个检查异常,这样您就可以对输入数据进行消毒。

是处理未检查的异常还是抛出已检查的异常更好?

抛出未检查异常。你总是可以抓住一个RuntimeException然后继续前进。然后我又偏向于未检查异常,因为我不喜欢所有检查异常。

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

是的,它应该按照下面的javadoc引号做。如果您想传达更具体的信息,可以创建自己的受控异常。这取决于你的设计。

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

我建议避免受控异常。参见下面的一些支持参数:

    检查异常可能有他们的位置,但它不是在Java
  • 为什么hibernate将HibernateException更改为RuntimeException (unchecked)

是定义自己的类扩展RuntimeException并抛出它,还是简单地允许抛出ArrayIndexOutOfBoundsException,这取决于上下文。

相关内容

  • 没有找到相关文章

最新更新