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

时间:2010-03-10 17:13:57

标签: java exception-handling checked-exceptions unchecked-exception

在阅读有关异常时,我会经常遇到已检查的异常和未经检查的异常,所以想知道如何区分这是什么?

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

每个人的意义是什么?

6 个答案:

答案 0 :(得分:18)

检查除Throwablejava.lang.RuntimeException的子类之外的所有java.lang.Error个。正确地说,在Java中,“exception”是java.lang.Exception的子类,“errors”是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:为回应评论(非常有效),澄清一下,确定捕获的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”的第二部分(例如,测试可抛出是多余的。)

答案 1 :(得分:5)

请参阅Java Language Spec, chapter 11

  

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

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

关于问题的第二部分:

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  • Error是内部VM错误,通常您无法对其进行管理。
  • Exception-您可以抓住并处理它

已选中与未选中

  • 已检查异常已由编译器检查,作为程序员,您必须使用try-catch-finallythrows
  • 处理它 编译器不会检查
  • unchecked 异常,但您可以选择对其进行显式管理

IntelliJ IDEA's Type Hierarchy工具在您想查找更多内容时很有用

答案 4 :(得分:0)

以前肯定会有人问过并回答过这个问题,但是为了这个问题,这里的内容很清楚:http://www.javapractices.com/topic/TopicAction.do?Id=129

严格地说,未经检查的异常将始终扩展RuntimeException,而已检查的异常则不会扩展try/catch。上述链接说明了何时使用。

正如其名称所示,呼叫者有义务处理已检查异常,通常会处理它们({{1}})或将其进一步传递到堆栈中。未经检查的异常通常被认为是由呼叫者无法控制的元素引起的。

答案 5 :(得分:-2)

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

    }

}