这是一个显示Java'Exception'类的相反行为的示例.
try {
}
catch(Exception ex) {
}
Run Code Online (Sandbox Code Playgroud)
在检查类型的异常的情况下,如果我们在try块中保留一个catch块而没有任何错误激发语句到该特定的已检查异常,则编译器将引发一个错误,如"此异常永远不会从try语句体中抛出".但在上面的情况下,编译器不会给出任何错误.
另一方面,如果我们使用throw关键字引发类型'Exception'类的异常,则异常不会自动地被调用到调用者,如下所示:
throw new Exception();
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,编译器会给出类似" Unhandled exception type Exception"的错
那么Java的Exception类是一个选中还是未选中的类型?
Jon*_*eet 10
Exception 是一个经过检查的例外 从JLS第11.2节:
未经检查的异常类是RuntimeException类及其子类,以及类Error及其子类.所有其他异常类都是已检查的异常类.
但是,你所看到的行为是能够在try块中没有任何东西的情况下捕获它而被声明抛出任何东西是由于JLS的第14.20节:
如果catch子句捕获已检查的异常类型E1但是没有检查的异常类型E2使得以下所有内容成立,那么这是一个编译时错误:
- E2 <:E1
- 对应于catch子句的try块可以抛出E2
- 没有紧接着的try语句的前一个catch块捕获E2或E2的超类型.
除非E1是类Exception.
原因是RuntimeException,这是一个未经检查的异常子类Exception.因此,与所有其他已检查的异常不同,可以catch (Exception)捕获未经检查的异常,可以查看(在简化模型中)可能被任何 try块抛出.基本上RuntimeException与异常层次混淆:(
关于异常你应该知道的事情:
Exceptions被选中,这意味着如果声明为throws,则必须处理(捕获)它们。粗略地说,这些是针对“非编程错误”的。例如IOExceptionRuntimeExceptions( 的子类Exception) 是unchecked,这意味着它们如果声明则不需要处理,并且在未声明时可能会抛出。粗略地说,这些是针对“编程错误”的。例如NullPointerExceptionErrors未选中,但并非如此Exceptions(见下文)。这些是针对“不可恢复”的错误。例如OutOfMemoryErrorThrowable是以上所有类的抽象父类尝试这个:
try {
....
} catch (RuntimeException e) {
....
}
Run Code Online (Sandbox Code Playgroud)
或者如果您期望运行时和非运行时异常:
try {
....
} catch (Throwable e) {
....
}
Run Code Online (Sandbox Code Playgroud)