【问题标题】:Java catching exceptions and subclasesJava 捕获异常和子类
【发布时间】:2011-07-15 13:00:05
【问题描述】:

你好,

在 Java 中,如果像 BufferedReader.read() 这样的方法说它可以抛出 IOException 并且我尝试在两个 catch 块中捕获 FileNotFoundExceptionIOException,如果文件没有,将输入什么 catch 块不存在?

是只输入最具体的还是两者都输入?

【问题讨论】:

    标签: java exception exception-handling try-catch throw


    【解决方案1】:

    将输入与异常匹配的第一个编码捕获。
    编辑以合并来自 Azodius 的注释

    例如:

    try {
       bufferedReader.read();
    } catch (FileNotFoundException e) {
       // FileNotFoundException handled here
    } catch (IOException e) {
       // Other IOExceptions handled here
    }
    

    以下代码无法编译:

    try {
       bufferedReader.read();
    } catch (IOException e) {
       // All IOExceptions (and of course subclasses of IOException) handled here
    } catch (FileNotFoundException e) {
       // Would never enter this block, because FileNotFoundException is a IOException
    }
    

    编译器消息说:

    FileNotFoundException 的无法到达的 catch 块。它已经被 IOException 的 catch 块处理了

    【讨论】:

    • @Azodious 哎呀——是的。这是一个编译器错误。谢谢,我会在回答中注明
    【解决方案2】:

    只有遇到的第一个 catch 块的异常类型与抛出的异常类型匹配时才会运行(更具体地说,将运行 (e instaceof <exception type>)==true 的第一个 catch 块)。其他 catch 块都不会运行。

    例如

    try{
        BufferedReader.read();
    }
    catch(FileNotFoundException e){System.out.println("FileNotFoundException");}
    catch(IOException e){System.out.println("IOException");}
    

    如果BufferedReader.read() 抛出FileNotFoundException,将打印FileNotFoundException

    请注意,以下内容实际上并未编译:

    try{
        BufferedReader.read();
    }
    catch(IOException e){System.out.println("IOException");}
    catch(FileNotFoundException e){System.out.println("FileNotFoundException");}
    

    因为Java意识到不可能捕获FileNotFoundException,因为所有FileNotFoundExceptions也是IOExceptions。

    【讨论】:

      【解决方案3】:

      第一个适用于那种类型的异常(并且只有那个)。所以如果你catch上面的两种异常类型按照你列出的顺序,FileNotFoundException就会被捕获。

      【讨论】:

        【解决方案4】:

        首先捕获特定异常。如果在特定异常之前捕获到通用异常,则会出现编译时错误。

        【讨论】:

          猜你喜欢
          • 2021-09-12
          • 1970-01-01
          • 2014-11-24
          • 2016-03-10
          • 2010-11-25
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多