有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:捕获未检查的异常与已检查的异常

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

因此,我有几个问题:

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

谢谢


共 (6) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    检查异常是编译器强制您处理的异常,而非未检查异常。现在,根据您的问题,您应该以一种方式编写代码,这样就不会出现引发未检查异常的场景(例如:-null pointerexception,ArrayIndexOutOfBoundsException)

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

    所以在理想情况下,不需要将未检查的异常转换为已检查的异常。是的,如果有具体的情况,我们可以在技术上做到这一点

  3. # 3 楼答案

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

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

    If I do throw a checked exception, should I use IllegalArgumentException? My understanding is that it is for illegal argument types, not an illegal number of arguments.

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

  4. # 4 楼答案

    基本上,当您决定处理运行时异常(在您的示例中为ArrayIndexBoundOfException)时,您很可能会在不突然中断应用程序的情况下进一步处理

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

  5. # 5 楼答案

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

    抛出未检查的异常。你随时都可以赶上RuntimeException继续前进。我还是偏向于未检查的异常,因为我不喜欢所有已检查的异常

    If I do throw a checked exception, should I use IllegalArgumentException?

    是的,它应该按照下面的javadoc引用来做。如果希望传达更具体的信息,可以创建自己的选中异常。这取决于你的设计

    Thrown to indicate that a method has been passed an illegal or inappropriate argument.

  6. # 6 楼答案

    如果您有办法重新提示用户输入正确的内容,即如果有合乎逻辑的方法来处理异常,那么就这样做。如果您希望调用堆栈中更高层的人来处理异常,那么抛出一个选中的异常。如果您只是想放弃,那么就让未检查的异常通过(或者在信息量更大的RuntimeException中重新打包它,以便于记录器最终捕获它)。这是所有例外情况的一般建议。(此外,不要记录异常并重新抛出它-要么记录它,要么重新抛出它,而不是两者都记录。)