1

为什么java.lang.RuntimeException(或它的子类)不强迫我们在 try/catch 中编写代码

假如:

java.lang.Exception或它的子类(称为检查异常)迫使我们在try/catch块中编写代码或强制我们处理它。

那么为什么java.lang.RuntimeExceptionor 子类(称为 unchecked-exception)强迫我们在 try/catch 块中编写代码,即使它正在扩展java.lang.Exception

添加示例:

public class ExceptionTest
{
    public static void main(String[] args)
    {
        // HOW COMPILER COME TO KNOW or DECIDE THIS METHOD IS THROWING RuntimeException or Exception (Keep in mind java.lang.RuntimeException is again extending java.lang.Exception) 
        new ExceptionTest().test_1();
    }

    public void test_1() throws MyException
    {

    }
}

class MyRuntimeRuntimeException extends RuntimeException
{
    public MyRuntimeRuntimeException() {
        // TODO Auto-generated constructor stub
    }
}

class MyException extends Exception
{
    public MyException() {
        // TODO Auto-generated constructor stub
    }
}
4

4 回答 4

1

这是因为Java编译器的设计知道,当有一个类扩展了RuntimeException时,它不会强制处理它。因为这些异常几乎不会发生。

所以它自己的编译器是为检查这种情况而设计的。

于 2013-08-08T09:42:45.720 回答
1

这是 Java 语言设计的一部分。RuntimeExceptions 旨在代表程序员表示错误的异常,称为未经检查的异常。所有其他异常都是检查异常,其目的是程序员必须通过捕获它们或在方法调用上使用 throws 声明来明确处理它们,以让调用者知道它们可能被抛出。

于 2013-08-08T07:11:15.657 回答
0

有可能抛出一些异常的方法是如此普遍,以至于如果每个可能抛出它们的方法都需要声明它们,那么它们几乎会出现在所有方法声明中。例如,任何使用引用访问对象成员的方法,在带有覆盖的 catch 的 try 块之外NullPointerException,都有可能抛出NullPointerException

在每个方法上声明NullPointerException都不会比在没有方法上声明它传达更多的信息,并且会使 throws 声明变得混乱。

RuntimeException系统避免用可以在任何地方抛出并且应该很少被捕获的异常来填充 throws 子句。

于 2013-08-08T07:26:40.477 回答
0

我认为它自己的定义很清楚。

运行时异常意味着无法通过语法检查来预先确定,并且代码的干执行,因此编译器无法意识到代码中该点可能发生的错误。

于 2013-08-08T07:12:22.000 回答