捕获块内的Java异常

捕获块内的Java异常,java,exception-handling,Java,Exception Handling,下面是一个代码: try { FileOutputStream fout=new FileOutputStream("path"); javaClassFun(url,fout); fout.close(); } catch (MalformedURLException ex) { System.err.println("Invalid URL"+ex); } catch (IOException e) { System.err.println("Inpu

下面是一个代码:

try {
    FileOutputStream fout=new FileOutputStream("path");
    javaClassFun(url,fout);
    fout.close();
} catch (MalformedURLException ex) {
    System.err.println("Invalid URL"+ex);
} catch (IOException e) {
    System.err.println("Input/Output error"+e);
}
当我剪切最后一个catch块并在try块之后粘贴它时,它给出了无法访问的catch块错误。
我想知道这背后的原因。

原因是
MalformedURLException
继承自
IOException

try {
    //call some methods that throw IOException's
} catch (IOException e) {
    // This will catch MalformedURLException since it is an IOException
} catch (MalformedURLExceptionn ex) {
    // Will now never be caught! Ah!
}
如果您想要设计能够正确处理异常层次结构的catch块,那么需要将超类放在最后,将要单独处理的子类放在它之前。有关如何处理与代码相关的
IOException
类层次结构,请参见下面的示例

try {
    //call some methods that throw IOException's
} catch (MalformedURLExceptionn ex) {
    // This will catch MalformedURLException 
} catch (IOException e) {
    // This will catch IOException and all other subclasses besides MalformedURLException
}

原因是
MalformedURLException
继承自
IOException

try {
    //call some methods that throw IOException's
} catch (IOException e) {
    // This will catch MalformedURLException since it is an IOException
} catch (MalformedURLExceptionn ex) {
    // Will now never be caught! Ah!
}
如果您想要设计能够正确处理异常层次结构的catch块,那么需要将超类放在最后,将要单独处理的子类放在它之前。有关如何处理与代码相关的
IOException
类层次结构,请参见下面的示例

try {
    //call some methods that throw IOException's
} catch (MalformedURLExceptionn ex) {
    // This will catch MalformedURLException 
} catch (IOException e) {
    // This will catch IOException and all other subclasses besides MalformedURLException
}

您可能应该解释这意味着什么,以及为什么它会产生OP看到的行为。@HunterMcMillen:更新了OP看到的问题的解释和解决方案。您可能应该解释这意味着什么,以及它产生OP所看到的行为的原因。@HunterMcMillen:更新了OP所看到的问题的解释和解决方案。当抛出
异常时,
catch
块检查抛出的异常是否是
catch
块中的
异常类型的实例,并将其留在
catch
块中。在您的示例中,包含
IOException
的catch块将吞下所有
IOException
及其子类型。i、 e.
MalformedUrlException
当抛出
异常
时,
catch
块检查抛出的异常是否是
catch
块中的
异常类型
的实例,并将其留在
catch
块内。在您的示例中,包含
IOException
的catch块将吞下所有
IOException
及其子类型。i、 e.
格式错误异常