&引用;java.lang.NoSuchFieldError:super“;编译器中的异常错误?
正在运行的以下用Java-9编写的代码在运行时给了我一个非常奇怪和有趣的异常:&引用;java.lang.NoSuchFieldError:super“;编译器中的异常错误?,java,javac,java-9,nosuchfieldexception,Java,Javac,Java 9,Nosuchfieldexception,正在运行的以下用Java-9编写的代码在运行时给了我一个非常奇怪和有趣的异常: Exception in thread "main" java.lang.NoSuchFieldError: super at A$C.test(A.java:15) at A.main(A.java:5) 守则: public class A { public static void main(String[] args) { new C().test(); }
Exception in thread "main" java.lang.NoSuchFieldError: super
at A$C.test(A.java:15)
at A.main(A.java:5)
守则:
public class A {
public static void main(String[] args) {
new C().test();
}
interface B {
private void test() {
}
}
static class C implements B {
void test() {
B.super.test();
}
}
}
我想知道:它是这样设计的,还是理想情况下不应该编译此代码,因此这是一个编译器错误?(我个人认为这是一个bug)
UPD:提交了一个bug,ID:9052188
UPD-2:它看起来像是
B.super.test()
通常是一个有效的构造,因为如果test()
方法是default
,那么它就可以正常工作。这一事实只会让事情变得更复杂。最终,Java开发人员支持团队承认这个问题是一个bug,这里有一个链接:猜测:a)这段代码无效(B超级接口是一个接口,因此没有必要遵从其中方法的实现)和B)是的,编译器bug。因此,合理的做法是:编写一个bug跟踪问题;-)当然,这是一个编译器错误。编译时没有错误且事后未被操作的程序在运行时不应得到NoSuchFieldError
(除非显式创建并抛出它本身),无论源代码是否有效。@GhostCat:不完全正确B
有一个private
方法,该方法是可访问的,因为它是一个嵌套类,并且我们在同一个顶级类中。但是我认为,B.super.test()
不是它的正确语法(但它是调用default
方法的正确语法)。相比之下,((B)this).test()
绝对是有效的语法,也能正确工作。@Andremoniy好吧,是的,不深入讨论,我们可以假设这可能是一个JVM错误,但我深入了super
access从不使用名为super
的字段实现,而且,当通过((B)this.)调用该方法时,test()
,它工作平稳。剩下的唯一问题是B.super.test()
是否有效,是否应该像((B)this.test()
那样编译,或者它是否无效,是否应该被编译器拒绝。我倾向于后者。我认为Interface.super.method()
是调用default
方法的正确方法,但就我在JLS中所看到的,它仅用于调用default
方法。关于可访问性,JVM从不允许其他(普通)类访问private
方法。这就是编译器为嵌套类生成这些合成的access$n
方法的原因。NoSuchFieldError
不是JVM拒绝方法访问的指示器。