我和其中一位前辈讨论过关于概念的Java问题
如果我通过扩展Exception类来创建一个类,那么它将被检查异常
如果我通过扩展Throwable,RuntimeException或Error来创建一个类,那么它将被取消选中Exception
以上陈述是否正确?
注意:我已通过此链接When to choose checked and unchecked exceptions
修改
在回答@Daemon时,他说道
另一方面,可抛出,由Exception扩展,因此是一个经过检查的例外
我有一个问题:Throwable也被Error扩展,所以为什么不是Unchecked?
答案 0 :(得分:2)
任何扩展Exception
但不扩展RuntimeException
的内容。 Java程序不应使用Error
和Throwable
,因为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)
Throwable
:Error extends Throwable
的子类,表示合理的应用程序不应该试图捕获的严重问题。覆盖Throwable
功能以取消选中。请参阅:Error (Java Platform SE 7)
Throwable
:Exception 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进行处理。错误不应该被处理,但让它们发生,因为它们是严肃的事情。