是java Exception类检查类型吗?

这是一个显示java’Exception’类的相反行为的示例。

Try { } catch(Exception ex) { } 

在检查类型的exception的情况下,如果我们在try块中保留一个catch块而没有任何错误激发语句到该特定的已检查exception,那么编译器将引发一个错误,如“此exception永远不会从try语句体中抛出”。 但在上面的情况下,编译器不会给出任何错误。

另一方面,如果我们使用throw关键字引发类型’Exception’类的exception,则exception不会自动地被调用到调用者,如下所示

 throw new Exception(); 

在上面的例子中,编译器给出了“Unhandled exception type Exception”之类的错误。

那么,java Exception类是检查类型还是未选中类型?

谢谢Raj。

Exception 一个经过检查的exception。 从JLS第11.2节 :

未经检查的exception类是RuntimeException类及其子类,以及类Error及其子类。 所有其他exception类都是已检查的exception类。

但是,你所看到的行为是能够在try块中没有任何东西的情况下捕获它而被声明抛出任何东西是由于JLS的第14.20节 :

如果catch子句捕获已检查的exception类型E1但是不存在已检查的exception类型E2,则以下所有内容都成为编译时错误:

  • E2 <:E1
  • 对应于catch子句的try块可以抛出E2
  • 直接封闭的try语句的前一个catch块没有捕获E2或E2的超类型。

除非E1是类Exception。

原因是RuntimeException ,它是Exception的未经检查的exception子类 。 因此,与所有其他已检查的exception不同, catch (Exception)可能捕获未经检查的exception,可以查看(在简化模型中)可能被任何 try块抛出。 基本上RuntimeException与exception层次结构混淆:(

RuntimeException,Error及其子类是未经检查的exception。 rest所有包括超级class级都经过检查。 当然,由于已检查的exception可以是Exception的子类,因此必须检查它本身。

你应该知道的例外情况:

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

尝试这个:

 try { .... } catch (RuntimeException e) { .... } 

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

 try { .... } catch (Throwable e) { .... } 

Checked Exception java编译器为在运行时顺利执行程序而检查的exception称为Checked Exception。

  1. 完全检查exception检查exception设置为当且仅当检查了所有子类时才完全检查。例如IOException,InterruptedException等。

  2. 部分检查exception当且仅当取消选中某些子类时,才会将Checked Exception设置为部分检查。 在整个exception层次结构中,唯一部分检查的exception是ExceptionThrowable

未经检查的exception java编译器未引发exception,无论exception是否引发都称为未经检查的exception。

注意: exception类既不是Checked也不是Unchecked Exception。 这是部分检查的例外。

Jon Skeet很接近,但并没有完全明白……他没有解释throw声明。 您对此的回答位于第14.18节- Java语言规范的throw语句 ,具体如下:

throw语句中的表达式必须表示引用类型的变量或值,该类型可赋值(第5.2节)为Throwable类型,或者发生编译时错误。 此外,以下三个条件中的至少一个必须为true,否则会发生编译时错误:

  • 该exception不是经过检查的exception(第11.2节) – 具体而言,下列情况之一为真:
    • Expression的类型是RuntimeException类或RuntimeException的子类。
    • Expression的类型是Error类或Error的子类。
  • throw语句包含在try语句的try块中(§14.20),并且Expression的类型可赋值(§5.2)为try语句的至少一个catch子句的参数类型。 (在这种情况下,我们说抛出的值是由try语句捕获的。)
  • throw语句包含在方法或构造函数声明中,并且Expression的类型可赋予(§5.2)至声明的throws子句(第8.4.6节,§8.8.5)中列出的至少一种类型。

您正在抛出一个Exception ,它不是RuntimeExceptionRuntimeException sublcass。 其他任何条件都不适用。

要validation这一点,抛出一个new RuntimeException()并查看编译器是否抱怨。