2011-12-08 248 views
8

下面是一个显示java'Exception'类的相反行为的例子。是否是java Exception class checked type?

Try 
{ 
} 
catch(Exception ex) 
{ 
} 

在检查型异常的情况下,如果我们保持一个catch块没有任何错误发人深省的语句在try块则该特定checked异常,编译器会产生一个错误,如“此异常从不抛出尝试声明身体“。但在上面的情况下,编译器不会给出任何错误。

在另一方面,如果我们用掷关键字提高型“异常”类的异常,异常不会自动躲开到主叫方,如下面

throw new Exception(); 

在上述情况下编译会出现错误,如“未处理的异常类型异常”。

那么,是java异常类是检查type还是unchecked type?

谢谢 Raj。

+0

FYI,Throwable的子类被检查,并且RuntimeException和Error的子类不被检查。您可以对Throwable进行子类化,并且不会出现错误或异常。 –

回答

1

的东西,你应该知道的例外:

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

的试试这个:

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

,或者如果你也希望能够运行时和非运行时异常:

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

Exception检查异常。从section 11.2 of the JLS

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

但是,你看到身边能抓住它没有在声明扔东西try块什么行为是由于section 14.20 of the JLS

这是一个编译时错误如果catch子句捕获检查异常类型E1,但不存在检查的异常类型E2,使得所有下列条件成立:

  • E2 <:E1
  • 对应于catch子句的try块可能会抛出E2
  • 紧邻封闭try语句的前面的catch块没有捕获E2或E2的超类型。

除非E1是类Exception。

这样做的原因是RuntimeException,这是Exception一个未经检查的异常子类。因此,与其他所有已检查的例外情况不同,catch (Exception)可能会捕获未经检查的例外,这可以通过任意try块查看(以简化模式)。基本上RuntimeException与异常的层次结构:(

2

RuntimeException,错误,及其子类是未经检查的异常。 。

0

乔恩斯基特接近,但没有得到它究竟是......他没有解释throw陈述你的问题的答案在于Java语言规范的部分14.18 - The throw Statement,具体为:

throw语句中的表达式必须表示一个变量或va 的引用类型可分配给Throwable类型(第5.2节),或 发生编译时错误。此外,以下 三个条件的至少一个必须是真实的,或发生编译时间错误:

  • 例外的是不是一个检查异常(§11.2) - 特别的 一个下列情况下是true:
    • 表达式的类型是 类RuntimeException或RuntimeException的一个子类。
    • 的类型表达式是Error类或Error的子类。
  • 的掷 语句包含在try语句(§14.20) 和表达的类型的try块是可分配的(第5.2节),以至少一个catch子句的 参数的类型try语句。 (在这个 的情况下,我们说抛出的值被try语句捕获。)
  • throw语句包含在方法或构造方法声明 中,并且表达式的类型可分配给至少一个在throws子句(§8.4.6,§8.8.5)中列出的 类型)的声明。

你抛出Exception,这是不是一个RuntimeExceptionRuntimeException sublcass。其他条件也不适用。

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

0

检查异常由java编译器检查以确保在运行时顺利执行程序的异常称为检查异常。

  1. 全面检查异常的Checked Exception被设置为全面检查,当且仅当它的所有子类checked.for例如IOException异常,InterruptedException异常等

  2. 部分的Checked Exception检查异常设定当且仅当它的一些子类都未被选上被部分检查。 在整个异常层次仅部分检查的异常是异常Throwable的

未经检查的异常不是由Java编译器引发的异常是否提高或不被称为未检查的异常的异常。

注意:异常类既不是检查也不是未检查异常。它是部分检查异常。

相关问题