Java的Exception类是检查类型吗?

raj*_*raj 9 java

这是一个显示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与异常层次混淆:(


Boh*_*ian 5

关于异常你应该知道的事情:

  • Exceptions选中,这意味着如果声明为throws,则必须处理(捕获)它们。粗略地说,这些是针对“非编程错误”的。例如IOException
  • RuntimeExceptions( 的子类Exception) 是unchecked,这意味着它们如果声明则不需要处理,并且在未声明时可能会抛出。粗略地说,这些是针对“编程错误”的。例如NullPointerException
  • Errors未选中,但并非如此Exceptions(见下文)。这些是针对“不可恢复”的错误。例如OutOfMemoryError
  • Throwable是以上所有类的抽象父类

尝试这个:

try {
    ....
} catch (RuntimeException e) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

或者如果您期望运行时和非运行时异常:

try {
    ....
} catch (Throwable e) {
    ....
}
Run Code Online (Sandbox Code Playgroud)