处理一个catch块中的所有Java异常

时间:2014-12-17 17:21:45

标签: java eclipse exception error-handling try-catch

当我尝试编写此代码时:

catch (Exception  | OutOfMemoryError| NumberFormatException| SQLException| IOException  e){
}

我收到错误: “异常NumberFormatException已被异常异常捕获” 我理解它很棒,并且从最初认为它是有意义的,因为异常是一般的。 但是当我写这段代码时:

 catch (Exception  | OutOfMemoryError  e){
    }

它没有任何问题,所以现在我开始感到困惑,为什么我没有得到以前的错误。 OutOfMemmoryError会捕获Exception无法捕获的内容吗? 如果我想制作包含所有异常和错误的捕获,我应该写什么? 我才明白这一点:

catch (Exception e){
}

不会抓住我所有的异常和错误,那么它会做什么呢?

5 个答案:

答案 0 :(得分:3)

代码catch (Exception | OutOfMemoryError e){ }已编译,因为OutOfMemoryError不是Exception,因此Exception不会涵盖OutOfMemoryErrorOutOfMemoryError is an Error并且它不是Exception

抓住Error通常不是一个好主意,因为无论如何它们通常是不可恢复的。

答案 1 :(得分:2)

要更好地了解发生的情况,请查看Java异常层次结构。可以在this diagram中看到广泛的概述。

当你在一个catch块中捕获多个异常时,你应该只使用" topmost"捕获中的异常。例如,您的错误将持续存在于

之类的内容中
catch (IOException | FileNotFoundException e)

因为FileNotFoundException扩展了IOException

在您的代码中,所有异常(OutOfMemoryError除外)都是java.lang.Exception的子类型,因此错误。 OutOfMemoryErrorjava.lang.Error的子类型,Throwable,但不是Error

这是more fine-grained diagram representing the hierarchy of all java.lang.Exceptions within Throwable

希望这会有所帮助。

最后,如果你 真的 想要捕获一个catch块中的所有异常和错误(一个可怕的想法,正如其他人指出的那样),你可以做其中一个以下内容:

catch (Exception | Error e)

catch (Throwable t)

答案 2 :(得分:2)

你可以捕获Throwable,它是一切的超类,可以抛出,错误或异常。

如前所述,这不是一个好主意,也不是你应该做的事情。您应该只捕获那些可以有意义地恢复的异常。

答案 3 :(得分:1)

不允许在multi-catch语句中指定同一层次结构的两个或更多异常。

答案 4 :(得分:1)

如果你想抓住'一切',你可以捕捉(Throwable t)哪些会捕获错误,异常,运行时异常等...虽然我建议捕获个别异常,因为你可能希望你的应用程序处理不同类型的例外/错误/不同。

相关问题