【问题标题】:Static methods & inheritance – java.lang.IllegalAccessError not found at compile-time静态方法和继承——编译时找不到 java.lang.IllegalAccessError
【发布时间】:2016-04-17 12:53:48
【问题描述】:

我有这样的文件结构和代码:

../inside/A.java

package inside;
public class A{protected static void someStaticMethod(){}}

../inside/B.java

package inside;
import inside.A;
public class B extends A{protected static void someStaticMethod(){}}

../inside/C.java

package inside;
import inside.B;
public class C extends B{protected static void someStaticMethod(){}}

../Z.java

import inside.*;
class Z extends B{
  public static void main(String args[]){
  A.someStaticMethod();
  B.someStaticMethod();
  C.someStaticMethod(); // Fine at compile-time but IllegalAccessError at run-time.
}

}

与注释一致,编译时没有错误,但运行时出现 IllegalAccesError。

这种行为的真正原因是什么?

我发现了一个问题 - Why does Java bind variables at compile time? - 在第一个答案中可能提到了原因,但我绝对不确定。

【问题讨论】:

  • 只有最后一行抛出错误吗?
  • 是的,只有最后一行会抛出错误。
  • 那是什么 Java 版本?
  • 我不知道它来自哪个版本,但我使用的是 Java 8。

标签: java inheritance static-methods


【解决方案1】:

由于您已将方法的可见性设置为protected,因此引发错误,这意味着只能从子类或同一个包中访问这些方法。

所以IllegalAccessError被抛出的原因是因为你的类Z不是C的子类,也不是ZC在同一个包中。

Eclipse 给我一个编译器错误:

“线程“main”中的异常 java.lang.Error:未解决的编译问题: C 类型的方法 doSomething() 不可见"

【讨论】:

  • 我知道这个错误的原因是什么,但我想知道为什么找不到错误和编译时间(除非我使用 cmd 中的 javac 来编译 Z .java).
  • 哦,对不起,我没听懂你的问题。那我帮不了你。如我的答案所示,eclipse给了我一个编译时间错误,代码完全相同,所以我不知道为什么它不适合你。
  • 这很有趣,因为在 NetBeans 中直到运行时才会出现错误。
  • @Dimitros Begnis 您能否删除您的回答,以便删除这个无益的问题?
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2023-04-05
    • 2012-06-21
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多