我有以下情况:
在同一工作区Apa和Bepa中的2个Eclipse项目(为简洁起见,使用别名)。
Project Apa参考(包括)项目Bepa。
我在Bepa中有一个X类,使用公共方法b()。
在项目Bepa中直接调用X.b()可以正常工作。
但是,在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中使用它。任何帮助将不胜感激。
最佳答案
IllegalAccessError是IncompatibleClassChangeError的子类。如果在执行代码时抛出IncompatibleClassChangeError,则通常表明您的代码未与针对其编译的类一起运行。
在您的情况下,导致抛出IllegalAccessError的方法是具有默认可见性的a constructor of the java_cup.runtime.Symbol
class:
Symbol(int sym_num, int state)
{
sym = sym_num;
parse_state = state;
}
调用此构造函数的代码在另一个程序包中,因此不应直接调用此构造函数。通常,此类错误会被编译器捕获,因为尝试从另一个程序包访问程序包私有成员会导致编译器错误。但是,就您而言,您似乎没有任何此类编译器错误。
如果您使用与编译时相同的类路径来运行代码,那么我只能猜测
java_cup.*
类在类路径上出现多次,并且上述构造函数具有不同的可见性。编译器必须已找到Symbol
类的一个副本,且该构造函数是公共的,而JVM必须已找到具有此构造函数package-private的副本。