9

以下は、コンパイルされないコードの一部です。

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
{}

サブクラス化によって例外タイプが関連付けられていなければ、すべてが魅力のように機能します。IOException私のコード スニペットの を say..に交換するとSQLException、機能します。仕様書には次のように書かれています。

型の共用体に 2 つの選択肢 Di と Dj (i ≠ j) が含まれている場合、コンパイル時エラーになります。ここで、Di は Dj のサブタイプです。

この背後にある理論的根拠を理解できません。確かに、私の例の multi-catch は完全に冗長IOExceptionです。しかし、私のコード スニペットを合法化すると、どのような害が生じるでしょうか? 慣行が違法になるには、確かに害がなければなりませんか?

4

3 に答える 3

5

仕様では、それについて説明しています

マルチキャッチ句は、一連のユニキャッチ句と考えることができます

だからあなたのコードは一種のようなものです

    try {
        throwIOFile();
    }
    catch (IOException e) { }
    catch (FileNotFoundException e) { }  // error

これは javac でも拒否されます。この場合、2 番目の句に到達できないため、エラーは正当化されます。


ただし、ユニオン型は禁止すべきではないと思います。せいぜい警告であるべきです。

于 2013-11-06T18:51:24.993 に答える