在阅读有关异常的内容时,我总是会遇到受控异常和非受控异常,所以想知道如何区分哪个是什么?

编辑:我想知道如果我创建任何异常类,那么如何创建为已检查或未检查的异常类?

每个的意义是什么?

有帮助吗?

解决方案

除了Throwablejava.lang.RuntimeException的子类所有java.lang.Errors被检查。正确,在Java中,“例外”是java.lang.Exception的子类,“错误”是通常不直接子类java.lang.Errorjava.lang.Throwable的子类。

程序不应该创建自己的Error子类(尽管文档上比较模糊),所以一般你总是创建Exceptions,使用RuntimeException,如果你不希望它被选中做。

要知道在运行时,如果你有一个检查例外您可以使用:

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

一个检查的异常是一个必须在catch子句进行任一处理,或如在方法签名被抛出声明;编译器强制执行此。通常,一个用途检查异常为应当由调用代码被处理的异常,而未经检查的例外是用于条件,它们是编程错误的结果,并且应该通过校正代码是固定的。

这是说,有在Java社区中有关使用checked异常与unchecked异常随处可见的功效很多争论 - 一个主题的方式来深在这个答案,讨论

修改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的测试是冗余的)

其他提示

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

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

你可以通过检查这个 instanceof 在运行时,虽然我真的不知道这会有什么用处。

关于你问题的第二部分:

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

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

如果异常类是RuntimeException的子类,它不检查,不必须申报功能或捕获等Error例外也不必声明/捕获。那是你在问什么?

很肯定这已要求和前回答,但对于它的缘故,它覆盖相当不错此处的 http://www.javapractices.com/topic/TopicAction.do?Id=129

严格地说,unchecked异常会一直延长RuntimeException而checked异常没有。所提到的连接说明了当要么使用。

正如其名称所示,呼叫者必须处理的检查异常,通常处理它们(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");
        }

    }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top