【问题标题】:Java: Catching exception - unchecked vs.checkedJava:捕获异常 - 未检查与已检查
【发布时间】:2013-04-13 03:16:28
【问题描述】:

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

所以,我有几个问题:

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

谢谢。

【问题讨论】:

  • 感谢所有精彩的回答!

标签: java exception checked illegalargumentexception unchecked


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        Would it be better form to handle the unchecked exception or throw a checked one?
        

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            抛出未经检查的异常。您随时可以收到RuntimeException 并继续前进。再说一次,我偏向于未检查的异常,因为我不喜欢 all 已检查的异常。

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

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

            抛出表明一个方法被传递了一个非法或不适当的参数。

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-09-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多