如何在java中识别已检查和未检查的exception?

在阅读关于exception的同时,我总会遇到检查exception和未经检查的exception,所以想知道如何区分哪个是什么?

编辑:我想知道我是否创建了任何exception类,那么我如何创建一个已选中或未选中?

每个人的意义是什么?

检查除了java.lang.RuntimeExceptionjava.lang.Error子类之外的所有Throwable 。 正确地说,在Java中,“exceptions”是java.lang.Exception子类,“errors”是java.lang.Error子类,而java.lang.Throwable通常不是直接子类。

程序不应该创建自己的Error子类(虽然文档上的内容相当模糊)所以通常你总是使用RuntimeException创建Exceptions ,如果你不想检查它。

要在运行时知道您是否有已检查的exception,您可以使用:

 if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) { // this is a checked Exception } 

已检查的exception是必须在catch子句中处理或声明为在方法签名中抛出的exception; 编译器强制执行此操作。 通常,对于应由调用代码处理的exception使用已检查的exception,而未经检查的exception用于由编程错误导致的条件,应通过更正代码来修复。

这就是说Java社区中存在很多关于使用已检查exception与未经检查的exception的效果的争论 – 这是在这个答案中深入讨论的主题方式。

编辑2012-10-23:为了回应评论(这些评论非常有效),为了澄清,以下将是确定捕获的Throwable是否为已检查的Throwable而不是已检查的Exception

 if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) { // this is a checked Throwable - ie Throwable, but not RuntimeException or Error } 

如果已知所讨论的对象是Throwable的实例(例如,它被捕获),则仅需要上述“if”的第二部分(例如,对Throwable的测试是多余的)。

请参阅Java语言规范,第11章 :

未经检查的exception类是RuntimeException类及其子类,以及类Error及其子类。 所有其他exception类都是已检查的exception类。 Java API定义了许多exception类,包括已检查和未选中的exception类。 程序员可以声明其他检查和未检查的exception类。

您可以在运行时通过instanceof检查这一点,但我真的没有看到它在哪里有用。

至于你问题的第二部分:

  • checked exception表示在正常程序执行期间可能发生的预期错误条件,因此总是必须以编程方式处理(编译器强制执行)

  • 未经检查的exception表示意外的错误条件,表示程序的exception状态,原因是输入,错误或运行时限制无效(例如内存); 编译器不会强制程序员处理这些,即如果你知道它们的发生,你只需要关心它们

如果exception类是RuntimeException的子类,则不会检查它,也不必为函数声明或捕获等等。 Errorexception也不必声明/捕获。 这就是你问的问题吗?

很确定之前会有人问过并回答过这个问题,但是为了它,它在这里得到了很好的介绍: http : //www.javapractices.com/topic/TopicAction.do ?Id = 129 。

严格地说,未经检查的exception将始终扩展RuntimeException检查的exception则不会。 上述链接说明了何时使用。

正如其名称所示,调用者必须处理已检查的exception,通常处理它们( try/catch )或将它们进一步传递到堆栈中。 未经检查的exception通常被认为是由呼叫者控制之外的元素引起的。

 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"); } } }