0

我有以下情况:

同一工作区中的 2 个 Eclipse 项目,Apa 和 Bepa(为简洁起见使用化名)。

Project Apa 引用(包括)项目 Bepa。

我在 Bepa 有一个 X 类,带有公共方法 b()。在项目 Bepa 中直接调用 Xb() 可以正常工作。

但是,在 Apa 中创建对 X 实例的引用,然后在此引用上调用 b() 会导致:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method java_cup.runtime.Symbol.<init>(II)V from class de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$LineColumnSymbol
at de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$LineColumnSymbol.<init>(MySymbolFactory.java:31)
at de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory.startSymbol(MySymbolFactory.java:95)
at java_cup.runtime.LRParser.parse(LRParser.java:393)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseStream(ParseEnvironment.java:152)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseScript(ParseEnvironment.java:118)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.SMTLIB2Parser.run(SMTLIB2Parser.java:47)
at de.uni_freiburg.informatik.ultimate.smtinterpol.Main.main(Main.java:121)
at de.uka.ilkd.key.keynterpol.KeYnterpolInterface.main(KeYnterpolInterface.java:36)

据我了解,罪魁祸首是 B 引用的第三方 jar。但是,我终生无法弄清楚为什么我只能在 Bepa 内部使用它,而不能在 Apa 内部使用它。任何帮助将不胜感激。

4

1 回答 1

2

IllegalAccessError 是IncompatibleClassChangeError的子类。如果在您的代码执行时抛出 IncompatibleClassChangeError,这通常表明您的代码没有使用编译时所针对的相同类运行。

在您的情况下,导致抛出 IllegalAccessError 的方法是具有默认可见性的的构造函数:java_cup.runtime.Symbol

    Symbol(int sym_num, int state)
    {
        sym = sym_num;
        parse_state = state;
    }

调用此构造函数的代码位于不同的包中,因此不应直接调用此构造函数。通常,编译器会捕获此类错误,因为尝试从另一个包访问包私有成员会导致编译器错误。但是,在您的情况下,您似乎没有任何此类编译器错误。

如果您使用与编译它相同的类路径运行代码,那么我只能猜测这些java_cup.*类在类路径上出现了不止一次,上面的构造函数具有不同的可见性。编译器必须找到Symbol该构造函数为公共的类的一个副本,并且 JVM 必须找到具有此构造函数包私有的副本。

于 2013-01-19T14:01:56.423 回答