20

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

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

每个的意义是什么?

4

6 回答 6

22

除了or的子类之外的所有Throwables都被检查。正确地,在 Java 中,“异常”是 的子类,“错误”是 的子类,通常不会直接子类化。java.lang.RuntimeExceptionjava.lang.Errorjava.lang.Exceptionjava.lang.Errorjava.lang.Throwable

程序不应该创建自己的Error子类(尽管文档对此相当模糊)所以通常你总是 create ,如果你不希望它被检查,则Exceptions使用 a 。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(例如它被捕获),则只需要上述“如果”的第二部分(例如,对 Throwable 的测试是多余的)。

于 2010-03-10T17:19:51.860 回答
5

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

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

你可以在运行时检查这个instanceof,虽然我真的不知道这在哪里有用。

至于你问题的第二部分:

  • 已检查异常表示预期的错误情况,可能在正常程序执行期间发生,因此必须始终以编程方式处理(编译器强制执行)

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

于 2010-03-10T17:23:44.860 回答
2

  • Error是内部 VM 错误,通常您无法管理它。
  • Exception- 你能够抓住并处理它

选中与未选中

  • 已检查的异常由编译器检查,作为程序员,您必须使用try-catch-finally,throws
  • 编译器不检查未经检查的异常,但您可以选择显式管理它

IntelliJ IDEA's Type Hierarchy当您想查找更多信息时,该工具很有用

于 2020-04-10T09:48:54.927 回答
1

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

于 2010-03-10T17:18:18.327 回答
0

可以肯定的是,这之前会被问到并回答过,但为了它,这里很好地介绍了它:http ://www.javapractices.com/topic/TopicAction.do?Id=129 。

严格来说,未经检查的异常总是会扩展RuntimeException,而检查的异常则不会。提到的链接解释了何时使用。

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

于 2010-03-10T17:18:49.157 回答
-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");
        }

    }

}
于 2013-09-12T18:22:08.463 回答