なぜ、このコンパイルしていますか?オーバーライドメソッドではありません例外のサブクラス

Douma:

それは例外のサブクラスではないながら、私は、なぜ次のコードのコンパイルを理解するために苦労を持っています。

class Test 
{
    public void run() throws IOException 
    {
        System.out.println("Test");
    }
}

class SubTest extends Test 
{
    //not a subclass of IOException, still compiles 
    public void run() throws RuntimeException 
    {
        System.out.println("Test from sub");
    }
}

class Sub2Test extends Test 
{
    //not a subclass of IOException, does not compile
    public void run() throws Exception  
    {
        System.out.println("Test from sub");
    }
}

私は理解してRuntimeExceptionチェックされない例外ですが、私はルールが、それは親の例外のサブクラスでなければならないことだと思いましたか?

azurefrog:

「私はのRuntimeExceptionがチェックされない例外であることを理解、私はルールが、それは親の例外のサブクラスでなければならないことだと思いました?」

セクションにおけるJLSで指定され、それは、一般的なルールである§11.2。例外のコンパイル時のチェック、状態(強調鉱山)

この方法は、スローをもたらすように指定しなくてもよいオーバーライドメソッドのthrows節任意チェック例外(その句をスローすることによってスローするように、オーバーライドされたメソッドが許可されていない§8.4.8.3)。

しかし、それは唯一のチェック例外に適用され、それはまた、明示的にと述べています

チェックされない例外クラス(§11.1.1は)コンパイル時のチェックから除外されています。

だから、コンパイラは事実を無視しようとしているRuntimeExceptionのサブクラスではありませんがIOException

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=329108&siteId=1