6

Java ではthrows、元の抽象メソッドが ( .) でない場合、オーバーライドされた抽象メソッドに何らかの例外を指定することはできoverridden method does not throw Exceptionません。ただし、Scalaではチェック例外がないため、これを行うことができます。わかりましたが、Java コンパイラーに何が起こっているかを知らせるアノテーションを使用する場合、そうでしょうか?@throws

この Scala コードを考えると:

package myscala

abstract class SFoo {
    def bar(): Unit
}

class SFoobar extends SFoo {
    @throws[Exception]
    override def bar(): Unit = {
        throw new Exception("hi there")
    }
}

私は 2 つの異なる Java プログラムを持っています。そのうちの 1 つは実行時にコンパイルされて実行され、もう 1 つはコンパイルされExceptionません。

コンパイル:

import myscala.SFoo;
import myscala.SFoobar;

public class Foobar {
    public static void main(String[] args) {
        SFoo mySFoo = new SFoobar();
        mySFoo.bar();
    }
}

コンパイルしない ( unreported exception Exception; must be caught or declared to be thrown):

import myscala.SFoo;
import myscala.SFoobar;

public class Foobar {
    public static void main(String[] args) {
        SFoobar mySFoo = new SFoobar();       // only difference is the declared type
        mySFoo.bar();
    }
}

よくわかりません。Java コンパイラは、そのような宣言がないSFoobar.barにもかかわらず例外をスローすることを宣言しているという事実を認識せずFoo.bar、その結果、同様のコンパイル エラーが発生するのはなぜですか?

4

1 に答える 1