下面的示例显示了 Java“Exception”类的相反行为。
try {
}
catch(Exception ex) {
}
在检查类型的异常的情况下,如果我们在 try 块中保留一个 catch 块,而没有任何对该特定检查异常的错误引发语句,那么编译器将引发一个错误,例如“该异常永远不会从 try 语句主体中抛出”。但在上述情况下,编译器不会给出任何错误。
另一方面,如果我们使用 throw 关键字引发“Exception”类类型的异常,则该异常不会自动回避给调用者,如下所示:
throw new Exception();
在上述情况下,编译器会给出类似“Unhandled exception type Exception
".
那么Java的Exception类是受检类型还是非受检类型呢?
Exception
is一个已检查的异常。从JLS 第 11.2 节:
未经检查的异常类是 RuntimeException 类及其子类,以及 Error 类及其子类。所有其他异常类都是检查异常类。
但是,您所看到的能够在 try 块中没有任何内容(声明抛出任何内容)的情况下捕获它的行为是由于JLS 第 14.20 条:
如果 catch 子句捕获检查异常类型 E1,但不存在检查异常类型 E2,从而满足以下所有条件,则这是一个编译时错误:
- E2 <:>
- catch子句对应的try块可以抛出E2
- 紧邻的 try 语句的前面的 catch 块没有捕获 E2 或 E2 的超类型。
除非 E1 是 Exception 类。
原因是RuntimeException
,这是一个未经检查的异常的子类Exception
。因此,与所有其他检查异常不同,它是可能的catch (Exception)
捕获未经检查的异常,可以将其视为(在简化模型中)可能由any try
堵塞。基本上RuntimeException
扰乱异常层次结构:(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)