当我尝试编写此代码时:
catch (Exception | OutOfMemoryError| NumberFormatException| SQLException| IOException e){
}
我收到错误: “异常 NumberFormatException 已被替代异常捕获” 我非常理解它,并且从一开始就认为这是有道理的,因为异常是通用的。 但是当我编写这段代码时:
catch (Exception | OutOfMemoryError e){
}
它的工作没有任何问题,所以现在我开始感到困惑为什么我没有收到之前的错误。 OutOfMemmoryError 会捕获 Exception 无法捕获的内容吗? 如果我想捕获所有可能的异常和错误,我应该写什么? 我刚刚明白了这一点:
catch (Exception e){
}
不会为我捕获所有异常和错误,那么该怎么做呢?
最佳答案
为了更好地了解发生的情况,请查看 Java 异常层次结构。广泛的概述可以在 this diagram 中看到。 .
当您在单个 catch block 中捕获多个异常时,您应该只使用 catch 中的“最顶层”异常。例如,您的错误将持续存在于类似
catch (IOException | FileNotFoundException e)
因为FileNotFoundException
扩展了IOException
。
在您的代码中,所有异常(OutOfMemoryError
除外)都是 java.lang.Exception
的子类型,因此会出现错误。 OutOfMemoryError
是 java.lang.Error
的子类型,它是一个 Throwable
,但不是 Error
。
这是一个more fine-grained diagram representing the hierarchy of all java.lang.Exception
s within Throwable
.
希望这有帮助。
最后,如果您真的想要在一个 catch block 中捕获所有异常和错误(正如其他人指出的那样,这是一个糟糕的想法),您可以执行以下操作之一以下内容:
catch (Exception | Error e)
或
catch (Throwable t)
关于java - 在一个 catch block 中处理所有 Java 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27531249/