编辑:嗯,我觉得很腼腆.我在看错了构造函数.根据Kal的回答,被调用的真实构造函数(见下文) - 违反了foreach循环的并发规则.
无论如何,谢谢你的帮助!它仍然可以帮助我修复代码中的实际错误.
所有
我是一个非常新的Java程序员,我只是刚开始掌握语言的基本句柄.我目前正在与对话参与者系统的工作,但已先行试图让逻辑的条款我们的系统的陈述符合规格.我差不多完成了,但遇到了以下错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.Term.<init>(Term.java:97)
at com.Term.substituteVariables(Term.java:251)
at com.Term.substituteVariables(Term.java:247)
at com.Term.substituteVariables(Term.java:247)
at com.TermPredTestArch.main(TermPredTestArch.java:40)
Run Code Online (Sandbox Code Playgroud)
有问题的方法,substituteVariables,基本上是一个复制构造函数,略有修改:它接受一个绑定映射,并递归遍历调用它的Term对象,沿途查找变量并将它们交换出来实例.奇怪的是,它似乎只是在我离开时的昨晚工作(虽然我没有广泛测试),但现在拒绝玩得很好; 我没有做过任何实质性的修改.
相关代码如下(第232-252行):
232 /** Returns a new Term with the appropriate bindings substituted */
233 public Term substituteVariables(Map<Variable, Symbol> bindings) {
234 ArrayList<Symbol> args = this.getArgs();
235 ArrayList<Symbol> newArgs = new ArrayList<Symbol>();
236 Set<Variable> vars = this.getVars();
237 Set<Variable> bindingKeys = bindings.keySet();
238 for(Symbol s: args) {
239 // if s is a Variable, …Run Code Online (Sandbox Code Playgroud) java ×1