【问题标题】:Java compile time checked exceptionJava 编译时检查异常
【发布时间】:2015-12-04 11:32:53
【问题描述】:

ExceptionIOException 都是编译时检查异常。

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

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

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

            }

            try{

            }catch(Exception e){ // Compile

            }
        }
    }

【问题讨论】:

  • 如果这是你的确切代码,它应该可以编译。
  • @RohitJain 否 由于 catch(IOException e),它将提供以下错误。错误消息 - 线程“main”java.lang.Error 中的异常:未解决的编译问题:IOException 的无法到达的 catch 块。在 Demo.main(Demo.java:6) 的 try 语句体中永远不会抛出此异常

标签: java exception checked-exceptions


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2013-08-30
        • 2010-12-21
        • 1970-01-01
        相关资源
        最近更新 更多