为什么Java multi-catch不能处理与子类相关的类型?

Mar*_*son 9 java types java-7 multi-catch

这是一段不能编译的代码:

void multiCatch()
{
    try {
        throwIOFile();
    }
    // FileNotFoundException extends IOException, hence this
    // does not compile ("alternatives" related by sub classing):
    catch (IOException | FileNotFoundException e) { }
}

void throwIOFile() throws IOException, FileNotFoundException
{}
Run Code Online (Sandbox Code Playgroud)

一切都像魅力一样,没有与子类别相关的异常类型.如果您IOException在我的代码片段中交换说.. SQLException,它可以工作.该规范内容如下:

如果类型的并集包含两个备选Di和Dj(i≠j),则其是编译时错误,其中Di是Dj的子类型.

我无法理解这背后的理由.当然,我的例子中的多次捕获是完全多余的,因为我也可以只捕获一个IOException.但是,使我的代码片段合法会有什么危害?当然,违法行为必然会造成伤害吗?

m0s*_*it0 11

在同一个catch中包含给定异常的子类根本没有任何意义,而且令人困惑,因为无论你指定的子类,无论如何都要输入catch.例如,你为什么要写

catch (IOException | FileNotFoundException e)
Run Code Online (Sandbox Code Playgroud)

如果

catch (IOException e)
Run Code Online (Sandbox Code Playgroud)

会有完全相同的行为吗?这简直令人困惑.

  • 我同意,我认为没有理由尝试特定的东西,这些东西本来就是通用的.我们正在尝试减少代码重复,因此我们将所有应该以相同方式处理的异常组合在一起. (2认同)

Zho*_*gYu 5

规范讨论

可以将多捕获子句视为一系列单捕获子句

所以你的代码有点像

    try {
        throwIOFile();
    }
    catch (IOException e) { }
    catch (FileNotFoundException e) { }  // error
Run Code Online (Sandbox Code Playgroud)

这也被javac拒绝。在这种情况下,错误是合理的,因为第二子句不可访问。


但是,我不认为工会类型应该被禁止。充其量应该是一个警告。