所有这些都是未经检查的例外?

时间:2013-08-05 05:22:38

标签: java exception

我和其中一位前辈讨论过关于概念的Java问题 如果我通过扩展Exception类来创建一个类,那么它将被检查异常
如果我通过扩展Throwable,RuntimeException或Error来创建一个类,那么它将被取消选中Exception

以上陈述是否正确?
注意:我已通过此链接When to choose checked and unchecked exceptions

修改
在回答@Daemon时,他说道 另一方面,可抛出,由Exception扩展,因此是一个经过检查的例外 我有一个问题:Throwable也被Error扩展,所以为什么不是Unchecked?

5 个答案:

答案 0 :(得分:2)

任何扩展Exception但不扩展RuntimeException的内容。 Java程序不应使用ErrorThrowable,因为Error旨在传达严重的,不可恢复的问题,例如完全耗尽内存,硬件问题等。

从技术上讲,只有扩展Exception的类才是例外; Error和其他Throwable不是例外,预计不会被常规程序捕获。

答案 1 :(得分:2)

你是正确的,任何扩展Exception的类都将是一个经过检查的异常,但是你的错误与下一个语句有关:

  

如果我通过扩展Throwable,RuntimeException或Error来创建一个类,那么它将被取消选中Exception

如果扩展RuntimeException或Error,则您的类将是未经检查的异常。

另一方面,Throwable被Exception扩展,并且异常是一个经过检查的异常。

以下代码实际演示了这些。有关详细信息,请Barry Ruzek's "Effective Java Exceptions"对此主题进行一些非常有趣的阅读。

public class JavaExceptions {

    public static void throwException() throws Exception {
        throw new Exception("This is a Checked Exception.");
    }

    public static void throwRuntimeException() throws RuntimeException {
        throw new RuntimeException("This is a Runtime Exception.");
    }

    public static void throwError() throws Error {
        throw new Error("This is an Error.");
    }

    public static void throwThrowable() throws Throwable {
        throw new Throwable("This is a Throwable.");
    }

    public static void main (String... args) {

        //Exception extends Throwable, thus both are checked Exceptions.
        try {
            throwThrowable();
            throwException();
        } catch (Throwable e) {
            //Handle exception (or throwable in this case)...
            e.printStackTrace();
        }

        //RuntimeException and Error are both unchecked exceptions.
        throwRuntimeException();
        throwError();
    }
}

编辑1:关于Error及其使用,这取自Oracle's Documentation

  

错误是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。大多数此类错误都是异常情况。 ThreadDeath错误,虽然是“正常”条件,但也是Error的子类,因为大多数应用程序不应该尝试捕获它。   一个方法不需要在其throws子句中声明在执行方法期间可能抛出但未捕获的任何Error类,因为这些错误是永远不应发生的异常情况。也就是说,出于编译时异常检查的目的,Error及其子类被视为未经检查的异常。

编辑2:我们在这里讨论的课程可以描述如下:

Throwable extends Object:应由任何需要抛出的类扩展的顶级类(如异常和错误)。 <{1}}已已检查。请参阅:Throwable (Java Platform SE 7)

ThrowableError extends Throwable的子类,表示合理的应用程序不应该试图捕获的严重问题。覆盖Throwable功能以取消选中。请参阅:Error (Java Platform SE 7)

ThrowableException extends Throwable的另一个子类,表示合理的应用程序可能想要捕获的条件。与Throwable一样,已检查。请参阅:Exception (Java Platform SE 7)

Throwable:在Java虚拟机的正常操作期间可以抛出的那些异常的超类。覆盖RuntimeException extends Exception功能以取消选中。请参阅:RuntimeException (Java Platform SE 7)

答案 2 :(得分:1)

从oracle文档:“出于编译时检查异常的目的,Throwable和Throwable的任何子类(也不是RuntimeException或Error的子类)都被视为已检查的异常。”所以,你的第一个语句是没错,第二个不是。 您可以在SCJP Sun认证程序员中阅读更多内容,了解Java 6 pg。 356-380。

答案 3 :(得分:0)

  

如果我通过扩展Exception类来创建一个类,那么它将是   检查异常

这是正确的。

  

如果我通过扩展Throwable,RuntimeException或Error来创建一个类,   然后它将被取消选中Exception

这是不正确的。类RuntimeException及其子类以及类Error及其子类是未经检查的异常类。因为编译器不会强制它们在throws子句中声明。属于Throwable层次结构的所有其他异常类都是已检查的异常。

答案 4 :(得分:0)

异常类和Error类都扩展了Throwable类。 RuntimeException类扩展了Exception类。检查的异常应该是在编译时使用try catch或throws的句柄。不需要对RunTimeExceptions进行处理。错误不应该被处理,但让它们发生,因为它们是严肃的事情。