【问题标题】:Why do I need multi-catch blocks when Java exits the try block when the first error is encountered?当Java遇到第一个错误时退出try块时,为什么我需要multi-catch块?
【发布时间】:2020-12-11 03:46:11
【问题描述】:

当运行时错误发生时,它会退出 try 块。它只会抛出一个异常并进入catch块。那为什么我需要多个 catch 块?多捕获块在哪里使用?

另外,我还可以使用Throwable 来捕获任何异常。对吗?

【问题讨论】:

  • @Turing85 什么的 MRE?这是一个概念问题;这与特定程序无关。
  • 编译器什么时候抛出异常?你的意思是运行时异常。编译器与它无关。
  • 运行时错误一发生就离开try块[只抛出一个错误对象],那为什么会有一个叫multi-catch块的概念呢?由于将抛出一个错误,因此只需一次捕获就足够了!!!
  • @LukasNothhelfer 呃,你有点挑剔。我已经删除了“编译器”这个词。
  • 这并不是很挑剔,尽管也许评论可以更好地措辞。了解编译在哪里结束以及程序的实际执行开始是成功编程的关键。

标签: java exception try-catch


【解决方案1】:

“编译器”没有做任何这些;编译器不在身边。异常是一种运行时现象。

您的问题似乎是在询问运行时异常调度程序如何选择异常处理程序:它基于类型匹配。

当您说“输入 捕获块”时,这是不正确的。它选择参数类型与实际抛出的异常赋值兼容的第一个 catch-block。

如果你总是写catch (Exception ex),那么这将捕获任何异常,因为Exception 是所有异常类型的超类,如果这是第一个这样的catch 块,则不会考虑其他任何异常。但这并不总是一种合适的异常处理方式。可能会建议您更具体。

也许这是理解多个 catch-blocks 的好方法:你说“如果它是 X 类型异常,则执行此操作;否则,如果它是 Y 类型异常,则执行其他操作;否则,如果它是Z 型异常然后是第三件事”。

FWIW,你很少想写catch (Throwable th),除非你完全了解你这样做会干扰的机制。

【讨论】:

    【解决方案2】:

    好吧,您可以使用多捕获块来捕获不同类型的异常。假设您有一个实现 Throwable 的自定义异常 MyCoolExn。

    try {
        // run piece of code
    } catch (MyCoolExn e) { // catching your custom exception
        System.out.println("custom exception occurred");
    } catch (Throwable e) { // catch any other exception
        System.out.println("an unknown exception occurred ");
    }
    

    请注意,块的顺序很重要。如果你交换它们,MyCoolExn 将永远不会被捕获,因为 Trowable 块会捕获所有内容

    【讨论】:

    • 这是一个很好的例子,尽管在“真正的编程”中,异常处理程序可能会做一些比仅仅打印出消息更复杂的事情,而且它所做的事情通常取决于特定的异常 -这就是你想要多个 catch 块的原因。
    • 但我认为在 JDK 7 的 java 版本中,它提供了一个称为 multi-catch 的新功能(即)在单个 catch 块中捕获多个异常,因为您不能使用添加的相同类型基类类型,例如 [catch(MyCoolExn | Throwable)] programiz.com/java-programming/multiple-exceptions -->Example-4
    • 看我的回答; “catch (X ex)”和“catch (Y ex)”子句的重点是允许针对不同的异常执行不同的操作。 “catch (X | Y ex)”语法允许您对不同的异常执行相同的操作。
    • @KavinVelusamy,是的,但是当您想在同一个块中捕获多个(与子类型无关的)异常时,它将以相同的方式处理它们。多捕获 try 块的异常(应在应以不同方式处理异常时使用)可以是彼此的子类型。您通常应该在最后拥有基本的 Exception 类,因此您可以捕获任何异常。如果你在任何超类之前有它,那么超类 catch 块是多余的,因为首先匹配 Exception
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2021-07-25
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多