7
class Y {
    public static void main(String[] args) throws RuntimeException{//Line 1
        try {
            doSomething();
        }
        catch (RuntimeException e) {
            System.out.println(e);
        }
    }
    static void doSomething() throws RuntimeException{ //Line 2
        if (Math.random() > 0.5) throw new RuntimeException(); //Line 3
        throw new IOException();//Line 4
    }
}

当我抛出两种类型的异常(Line4 中的 IOException 和 Line3 中的 RunTimeException)时,我发现我的程序无法编译,直到我在第 1 行和第 2 行的 throws 子句中指出“IOException”。

而如果我反转“抛出”以指示抛出 IOException,则程序确实编译成功,如下所示。

class Y {
    public static void main(String[] args) throws IOException {//Line1
        try {
            doSomething();
        }
        catch (RuntimeException e) {
            System.out.println(e);
        }
    }
    static void doSomething() throws IOException {//Line 2
        if (Math.random() > 0.5) throw new RuntimeException();//Line 3
        throw new IOException();//Line 4
    }
}

即使 RuntimeException 也被抛出(第 3 行),为什么我应该总是对 IOException 使用“抛出”?

4

2 回答 2

19

因为IOException是一个检查异常,应该被处理或声明被抛出。相反,RuntimeException是一个未经检查的异常。您不需要处理或声明它在方法 throws 子句中被抛出(这里我的意思是,如果您不处理未经检查的异常,它在语法上是正确的。编译器不会生气)。但是,在某些情况下,您需要针对某些未经检查的异常处理并采取相应措施。


相关帖子:

参考:

于 2013-08-24T08:22:50.853 回答
1

原因是在这种情况下有两种不同类型的异常。一个是checked应该由程序员处理的unchecked异常,另一个是不需要特殊处理的异常。

于 2013-08-24T08:23:28.397 回答