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”后,程序才编译。

而如果我反转“throw”以表明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使用“throws”?

最佳答案

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

相关文章:

  • Java: checked vs unchecked exception explanation
  • When to choose checked and unchecked exceptions

  • 引用:
  • JLS - Kinds and Cause of Exceptions
  • Oracle Exceptions Tutorial
  • 关于java - IOException vs RuntimeException Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18416511/

    10-11 10:41