2

3行目はコンパイルしないのに2行目はコンパイルするのはなぜですか? spit() は、1 行目ですでにキャッチされている HurtException をスローするため、その後に発生するチェック済み例外は到達できないはずです。ライン 2 を削除すると、ライン 3 は到達可能なままになります。例外は、コンパイル時のチェックから除外されません。これを明確にしてくれてありがとう。

public class Ape {
    public void run() {
        try {
            spit();
        } catch (HurtException e) { //line 1
            System.out.println("f");
        } catch (LimpException ex) { //line 2: Unreachable, HurtException already caught
            System.out.println("e");
        } catch (Exception ee) {     //line 3: Compiles, why?
            System.out.println("r");
        }
    }

    public static void main(String[] args) {
        new Ape().run();
    }

    public void spit() throws HurtException {
        throw new HurtException();
    }

    class LimpException extends Exception {
    }

    class HurtException extends LimpException {
    }
}
4

2 に答える 2

3

コンパイラは、そのように明示的に定義したため、HurtExceptionスローされる可能性があることを「知っている」だけです。spit()メソッド シグネチャの一部に追加LimpExceptionするとthrows、コンパイラは満足するはずです。

public void spit() throws HurtException, LimpException {
    throw new HurtException();
}

とにかく、メソッドが実際にスローしない場合は、LimpException基本的にコードを読みにくくするだけです。

于 2015-09-25T13:57:10.143 に答える