Java中的Catch块会捕获错误吗?

2023/05/30

1. 概述

在这篇简短的文章中,我们将展示如何正确捕获Java错误,并且我们将解释何时这样做没有意义。

有关Java中Throwable的详细信息,请查看我们关于Java中异常处理的文章。

2. 捕捉错误

由于Java中的java.lang.Error类不继承自java.lang.Exception,因此我们必须在catch语句中声明Error基类-或者我们想要捕获的特定Error子类,才能捕获它。

因此,如果我们运行以下测试用例,它将通过:

@Test(expected = AssertionError.class)
public void whenError_thenIsNotCaughtByCatchException() {
    try {
        throw new AssertionError();
    } catch (Exception e) {
        Assert.fail(); // errors are not caught by catch exception
    }
}

但是,以下单元测试期望catch语句捕获错误:

@Test
public void whenError_thenIsCaughtByCatchError() {
    try {
        throw new AssertionError();
    } catch (Error e) {
        // caught! -> test pass
    }
}

请注意,Java虚拟机抛出错误以指示它无法从中恢复的严重问题,例如内存不足和堆栈溢出等。

因此,我们必须有一个非常非常好的理由来捕获错误!

3. 总结

在本文中,我们了解了何时以及如何在Java中捕获Error。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章