是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
- 取消选中
RuntimeExceptions
(Exception
的子类),这意味着它们在声明时不需要处理,并且可能在未声明时被抛出。 粗略地说,这些都是针对“编程错误”的。 例如NullPointerException
-
Errors
未经检查,但不是Exceptions
(见下文)。 这些是“不可恢复的”错误。 例如OutOfMemoryError
-
Throwable
是上述所有的抽象父类
尝试这个:
try { .... } catch (RuntimeException e) { .... }
或者如果您期望运行时和非运行时exception:
try { .... } catch (Throwable e) { .... }
Checked Exception java编译器为在运行时顺利执行程序而检查的exception称为Checked Exception。
-
完全检查exception检查exception设置为当且仅当检查了所有子类时才完全检查。例如IOException,InterruptedException等。
-
部分检查exception当且仅当取消选中某些子类时,才会将Checked Exception设置为部分检查。 在整个exception层次结构中,唯一部分检查的exception是Exception和Throwable
未经检查的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
,它不是RuntimeException
或RuntimeException
sublcass。 其他任何条件都不适用。
要validation这一点,抛出一个new RuntimeException()
并查看编译器是否抱怨。