这是一个显示Java'Exception'类的相反行为的示例。
try {
}
catch(Exception ex) {
}
如果检查了异常类型,如果我们在try块中保留一个catch块而没有任何错误激发语句到该特定的已检查异常,则编译器将引发一个错误,如“此异常永远不会从try语句主体中抛出” 。但在上面的情况下,编译器不会给出任何错误。
另一方面,如果我们使用throw关键字引发类型'Exception'类的异常,则异常不会自动地被调用到调用者,如下所示:
throw new Exception();
在上述情况下,编译器会出现类似“Unhandled exception type Exception
”的错误。
Java的Exception类是一个选中还是未选中的类型?
答案 0 :(得分:10)
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
混淆了异常层次结构:(
答案 1 :(得分:3)
你应该知道的例外情况:
Exceptions
已检查,这意味着如果声明为throws
,则必须对其进行处理(捕获)。粗略地说,这些都是针对“非编程错误”的。例如IOException
RuntimeExceptions
(Exception
的子类)未选中,这意味着它们在声明时不需要处理,并且可能在未声明时被抛出。粗略地说,这些都是针对“编程错误”的。例如NullPointerException
Errors
未选中,但不是Exceptions
(见下文)。这些是“不可恢复的”错误。例如OutOfMemoryError
Throwable
是以上所有试试这个:
try {
....
} catch (RuntimeException e) {
....
}
或者如果您期望运行时和非运行时异常:
try {
....
} catch (Throwable e) {
....
}
答案 2 :(得分:2)
RuntimeException,Error及其子类是未经检查的异常。休息所有包括超级班级都要检查。当然,由于已检查的异常可以是Exception的子类,因此必须对其进行检查。
答案 3 :(得分:2)
检查异常 java编译器为在运行时顺利执行程序而检查的异常称为Checked Exception。
完全检查异常当且仅当检查了所有子类时,将检查异常设置为完全检查。例如, IOException,InterruptedException等。
部分检查异常当且仅当取消选中某些子类时,才会将Checked Exception设置为部分检查。 在整个异常层次结构中,唯一部分检查的例外是例外和 Throwable
未经检查的异常 java编译器未引发异常,无论是否引发异常都被称为未经检查的异常。
注意: 异常类既不是Checked也不是Unchecked Exception。它是部分检查的例外。
答案 4 :(得分:0)
Jon Skeet很接近,但没有完全明白......他没有解释throw
陈述。您对此的回答位于Java语言规范的14.18 - The throw
Statement部分,具体为:
throw语句中的表达式必须表示变量或值 可分配(第5.2节)类型为Throwable的引用类型,或 发生编译时错误。而且,至少以下之一 必须满足三个条件,否则会发生编译时错误:
- 异常不是检查异常(第11.2节) - 特别是,其中之一 以下情况属实:
- 表达式的类型是 class RuntimeException或RuntimeException的子类。
- 的类型 Expression是类Error或Error的子类。
- 投掷 语句包含在try语句的try块中(§14.20) 并且表达式的类型可分配(第5.2节)到类型 try语句的至少一个catch子句的参数。 (在此 我们说抛出的值是由try语句捕获的。)
- 的 throw语句包含在方法或构造函数声明中 并且表达式的类型可以赋予(第5.2节)至少一个 声明的throws子句(第8.4.6节,§8.8.5)中列出的类型。
您投掷的Exception
不是RuntimeException
或RuntimeException
的次级投标。其他任何条件都不适用。
要验证这一点,请抛出new RuntimeException()
并查看编译器是否抱怨。