throws
在 Java 中,如果原始抽象方法没有( .) ,则无法指定被覆盖的抽象方法某个异常( overridden method does not throw Exception
。)但是在 Scala 中,您可以这样做,因为它没有检查的异常。很好,但是如果您使用@throws
应该提示 Java 编译器了解正在发生的事情的注释,对吗?
鉴于此 Scala 代码:
package myscala
abstract class SFoo {
def bar(): Unit
}
class SFoobar extends SFoo {
@throws[Exception]
override def bar(): Unit = {
throw new Exception("hi there")
}
}
我有两个不同的 Java 程序,其中一个将编译并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();
}
}
我真的不明白。SFoobar.bar
为什么即使Foo.bar
没有这样的声明,Java 编译器也没有注意到我声明会引发异常的事实,并因此引发类似的编译错误?