IOException与RuntimeException Java

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 } } 

当我抛出两种类型的exception(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 } } 

为什么我总是对IOException使用“throws”,即使还抛出了RuntimeException(第3行)?

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


相关文章:

  • Java:已检查vs未经检查的exception说明
  • 何时选择已检查和未检查的例外

参考文献:

  • JLS – 例外的种类和原因
  • Oracleexception教程

原因是在这种情况下有两种不同类型的例外。 一个是经过checkedexception,应由程序员处理,另一个是uncheckedexception,不需要特殊处理。