当我尝试编写此代码时:
catch (Exception | OutOfMemoryError| NumberFormatException| SQLException| IOException e){
}
我收到错误: “异常NumberFormatException已被异常异常捕获” 我理解它很棒,并且从最初认为它是有意义的,因为异常是一般的。 但是当我写这段代码时:
catch (Exception | OutOfMemoryError e){
}
它没有任何问题,所以现在我开始感到困惑,为什么我没有得到以前的错误。 OutOfMemmoryError会捕获Exception无法捕获的内容吗? 如果我想制作包含所有异常和错误的捕获,我应该写什么? 我才明白这一点:
catch (Exception e){
}
不会抓住我所有的异常和错误,那么它会做什么呢?
答案 0 :(得分:3)
代码catch (Exception | OutOfMemoryError e){ }
已编译,因为OutOfMemoryError
不是Exception
,因此Exception
不会涵盖OutOfMemoryError
。 OutOfMemoryError
is an Error
并且它不是Exception
。
抓住Error
通常不是一个好主意,因为无论如何它们通常是不可恢复的。
答案 1 :(得分:2)
要更好地了解发生的情况,请查看Java异常层次结构。可以在this diagram中看到广泛的概述。
当你在一个catch块中捕获多个异常时,你应该只使用" topmost"捕获中的异常。例如,您的错误将持续存在于
之类的内容中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块中的所有异常和错误(一个可怕的想法,正如其他人指出的那样),你可以做其中一个以下内容:
catch (Exception | Error e)
或
catch (Throwable t)
答案 2 :(得分:2)
你可以捕获Throwable
,它是一切的超类,可以抛出,错误或异常。
如前所述,这不是一个好主意,也不是你应该做的事情。您应该只捕获那些可以有意义地恢复的异常。
答案 3 :(得分:1)
不允许在multi-catch语句中指定同一层次结构的两个或更多异常。
答案 4 :(得分:1)
如果你想抓住'一切',你可以捕捉(Throwable t)哪些会捕获错误,异常,运行时异常等...虽然我建议捕获个别异常,因为你可能希望你的应用程序处理不同类型的例外/错误/不同。