如何解释异常是否会捕获运行时异常?

2022-08-31 14:27:38

这对我来说很奇怪。 继承自 ,继承自 。RuntimeExceptionExceptionThrowable

catch(Exception exc) { /* won't catch RuntimeException */

catch(Throwable exc) { /* will catch RuntimeException */

我知道这是特别的,因为它是不受控制的。但据我所知,这只适用于是否必须声明例外,而不适用于是否捕获例外。即使这样,我也不知道为什么这种逻辑会在捕捉时中断 。RuntimeExceptionThrowable

这与我非常相关,因为我有一个可以在终端操作中被抛出的情况。我不确定这个模式的名称,但就像,我的类取一个数组。代码如下所示:RuntimeExceptionEmailRollerCallbacks

for(Callback cb : callbacks) {
    try {
        cb.call(item);
    }
    catch(Exception exc) {
        logger.error("Error in callback: ", exc);
   }
}

因此,在这种情况下,像OOME这样的东西需要飞过,因为如果这些回调之一消耗了所有机器内存,那么肯定会影响其他回调的运行。但是一个 ?还是一个?这些将影响回调,但不会阻止其他回调运行。NullPointerExceptionIndexOutOfBoundsException

此外,这有点像企业设计。不同的程序员或团队可以添加回调来处理项目,但它们应该彼此隔离。这意味着,作为负责将这些回调彼此隔离的程序员,我不应该依赖它们来确保错误不会漏掉。捕捉应该是关于正确的线,但这并不是因为滑过。所以我更一般的问题是:这里什么是好的模式?只是,我认为这是由于继承而导致的语法错误?ExceptionRuntimeExceptioncatch(Exception | RuntimeException exc)


答案 1

这个问题的前提是有缺陷的,因为捕捉确实抓住了。演示代码:ExceptionRuntimeException

public class Test {
    public static void main(String[] args) {
        try {
            throw new RuntimeException("Bang");
        } catch (Exception e) {
            System.out.println("I caught: " + e);
        }
    }
}

输出:

I caught: java.lang.RuntimeException: Bang

在以下情况下,您的循环将出现问题:

  • callbacks为空
  • 在执行循环时,任何内容都会修改(如果它是集合而不是数组)callbacks

也许这就是你所看到的?


答案 2
catch (Exception ex) { ... }

捕获运行时异常。

无论你放入捕获块中的任何内容以及它的子类都将被捕获。