4

Exception两者IOException都是编译时检查的异常。

但是,我们不能IOException在 catch 块中使用。但是我们可以Exception在 catch 块内使用它的原因是什么。

    import java.io.*;
    class Demo{
        public static void main(String args[]){
            try{

            }catch(IOException e){ // Does not compile

            }

            try{

            }catch(Exception e){ // Compile

            }
        }
    }
4

3 回答 3

9

Exception除了(or Throwable)之外,您无法捕获在 try 块中从未抛出的已检查异常。此行为由JLS 第 11.2.3 节指定:

如果 catch 子句可以捕获已检查的异常类 E1,并且与该 catch 子句对应的 try 块不能抛出作为 E1 的子类或超类的已检查异常类,则这是编译时错误,除非 E1 是异常或异常的超类。

于 2015-09-08T17:25:52.923 回答
0

要回答为什么 Exception 块正在编译而 IOException 不是...只是因为一切都继承自 Exception 类,它包括所有类型的异常,例如 IOException、RuntimeException 等。当您指定捕获 Exception 时,代码中的任何内容都不必抛出它作为运行时抛出的 RuntimeException,代码编译器无法预测会发生这种情况。但是 IOException 是一个特定的异常,只在某些情况下发生,因此编译器确切地知道它什么时候可能发生,如果它没有检测到任何可能抛出它的代码,它就不会编译。

于 2015-09-08T17:40:53.740 回答
0

看,主要原因是,您可以捕获任何 RuntimeException,不管它是否从 try 块中抛出,并且 RuntimeException 是扩展 Exception 类本身的类。因此,作为父类,总是允许捕获“异常”。在您的情况下 IOException 检查异常,仅当您尝试阻止有可能抛出它时才允许。

于 2016-10-25T13:45:16.760 回答