【发布时间】:2011-01-26 00:17:18
【问题描述】:
在阅读异常时,我总会遇到受检异常和未受检异常,所以想知道如何区分哪个是什么?
编辑:我想知道我是否创建了任何异常类,那么我如何创建为已选中或未选中?
各有什么意义?
【问题讨论】:
标签: java exception-handling checked-exceptions unchecked-exception
在阅读异常时,我总会遇到受检异常和未受检异常,所以想知道如何区分哪个是什么?
编辑:我想知道我是否创建了任何异常类,那么我如何创建为已选中或未选中?
各有什么意义?
【问题讨论】:
标签: java exception-handling checked-exceptions unchecked-exception
检查除java.lang.RuntimeException 或java.lang.Error 的子类之外的所有Throwables。正确地,在 Java 中,“异常”是 java.lang.Exception 的子类,“错误”是 java.lang.Error 的子类,java.lang.Throwable 通常不直接子类化。
程序不应该创建自己的Error 子类(尽管文档对此相当模糊)所以通常你总是创建Exceptions,如果你不想检查它,使用RuntimeException。
要在运行时知道您是否有检查过的异常,您可以使用:
if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
// this is a checked Exception
}
已检查异常是必须在 catch 子句中处理或在方法签名中声明为抛出的异常;编译器强制执行此操作。通常,对于应该由调用代码处理的异常,使用受检异常,而未受检异常用于由编程错误导致的情况,应该通过更正代码来修复。
也就是说,Java 社区中存在很多关于在任何地方使用受检异常与未受检异常的有效性的争论——这是在此答案中深入讨论的主题方式。
编辑 2012-10-23: 为了回应 cmets(这是非常有效的),澄清一下,确定捕获的 Throwable 是否已检查需要以下内容Throwable 而不是选中的Exception:
if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) {
// this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error
}
如果有问题的对象已知是Throwable 的一个实例(例如它被捕获),则只需要上述“if”的第二部分(例如,对 Throwable 的测试是多余的)。
【讨论】:
Throwable 继承但不是从Exception 继承的异常,这些异常已被检查。通常你有: 一个未检查的“异常”将满足:t instanceof Error || t instanceof Exception 其他所有 instanceof Throwable 都被检查。错误是一般意义上的异常类型。
Errors 是 Errors,而不是 Exceptions,Java 在命名上有所区别(@987654341 @ 处理是理论在实践中失败的另一种情况,但我认为,这是一个相关但单独的讨论)。也就是说,Errors 也会被检查,但在 Java 命名法中它们是错误,而不是异常;然而,错误和异常都是Throwables。根据 Java 的说法,Error 是 Throwable,但不是 Exception(在英语中更普遍的是,Errors 是“例外”,但它们不是“例外”)。
Throwable 但不是 Exception 或 Error 的东西。你怎么称呼它们?
Throwable 的直接子类的人。顺便说一句,我已经更新了我的答案以缓解您的担忧。
见Java Language Spec, chapter 11:
未经检查的异常类是类
RuntimeException及其子类,以及类Error及其子类。所有其他异常类都是检查异常类。 Java API 定义了许多异常类,包括选中的和未选中的。程序员可以声明额外的异常类,包括检查的和未检查的。
您可以在运行时通过instanceof 进行检查,但我真的不知道这在哪里有用。
关于你问题的第二部分:
检查的异常表示预期的错误情况,可能在正常程序执行期间发生,因此必须始终以编程方式处理(编译器强制执行)
未经检查的异常表示由于无效输入、错误或运行时限制(例如内存)而导致的意外错误情况并表示程序的异常状态;编译器不会强迫程序员处理这些,也就是说,如果你知道它们的发生,你只需要关心它们
【讨论】:
Error 是内部虚拟机错误,通常您无法管理它。 Exception - 你可以抓住它并处理它选中与未选中
try-catch-finally、throws 处理它
IntelliJ IDEA'sType Hierarchy 工具在您想查找更多信息时很有用
【讨论】:
如果异常类是RuntimeException 的子类,则不会对其进行检查,也不必为函数声明或捕获等。Error 异常也不必声明/捕获。你问的是这个吗?
【讨论】:
很确定这个问题之前已经被问过并回答过,但为了它,这里很好地介绍了它:http://www.javapractices.com/topic/TopicAction.do?Id=129。
严格来说,未经检查的异常将始终扩展RuntimeException,而检查的异常则不会。提到的链接解释了何时使用。
顾名思义,调用者必须处理已检查异常,通常是处理它们 (try/catch) 或将它们向上传递到堆栈。未经检查的异常通常被认为是由调用者无法控制的元素引起的。
【讨论】:
package practice;
import java.io.IOException;
class Practice
{
public static void main(String args[])
{
Exception n=new NullPointerException();
if(n instanceof RuntimeException)
{
System.out.println("this is a runtime(unchecked) exception");
}
else
{
System.out.println("this is not a compiletime(checked) exception");
}
}
}
【讨论】: