当运行时错误发生时,它退出try块。它将只抛出一个异常并进入catch块。那为什么我需要多个挡块?在哪里使用多挡块?另外,我也可以用 Throwable 捕捉任何异常。是这样吗?
Throwable
i2byvkas1#
“编译器”没有这样做;编译器不在。异常是一种运行时现象。您的问题似乎是询问运行时异常调度器如何选择异常处理程序:它基于类型匹配。当你说“进入挡块”时,那是不对的。它选择第一个catch块,其参数类型与实际抛出的异常的赋值兼容。如果你总是写信 catch (Exception ex) 那么这将捕获任何异常,因为 Exception 是所有异常类型的超类,如果这是第一个这样的catch块,则不会考虑其他块。但这并不总是一种合适的异常处理方式;你可能会被建议更具体一些。也许这是理解多个catch块的一个好方法:您的意思是“如果是x类型的异常,那么就这样做;否则,如果它是y类型的异常,那么做另一件事;否则,如果它是一个z类型的异常,那么第三件事”。fwiw,你很少想写 catch (Throwable th) 除非你完全意识到你这样做所干扰的机制。
catch (Exception ex)
Exception
catch (Throwable th)
bvjveswy2#
可以使用multi-catch块来捕获不同类型的异常。假设您有一个实现throwable的自定义异常mycolexn。
try { // run piece of code } catch (MyCoolExn e) { // catching your custom exception System.out.println("custom exception occurred"); } catch (Throwable e) { // catch any other exception System.out.println("an unknown exception occurred "); }
请注意,块的顺序很重要。如果你交换它们,mycolexn将永远不会被捕获,因为trowable块将捕获所有东西
2条答案
按热度按时间i2byvkas1#
“编译器”没有这样做;编译器不在。异常是一种运行时现象。
您的问题似乎是询问运行时异常调度器如何选择异常处理程序:它基于类型匹配。
当你说“进入挡块”时,那是不对的。它选择第一个catch块,其参数类型与实际抛出的异常的赋值兼容。
如果你总是写信
catch (Exception ex)
那么这将捕获任何异常,因为Exception
是所有异常类型的超类,如果这是第一个这样的catch块,则不会考虑其他块。但这并不总是一种合适的异常处理方式;你可能会被建议更具体一些。也许这是理解多个catch块的一个好方法:您的意思是“如果是x类型的异常,那么就这样做;否则,如果它是y类型的异常,那么做另一件事;否则,如果它是一个z类型的异常,那么第三件事”。
fwiw,你很少想写
catch (Throwable th)
除非你完全意识到你这样做所干扰的机制。bvjveswy2#
可以使用multi-catch块来捕获不同类型的异常。假设您有一个实现throwable的自定义异常mycolexn。
请注意,块的顺序很重要。如果你交换它们,mycolexn将永远不会被捕获,因为trowable块将捕获所有东西