AnyLogic模型突发'Duplicate local variable self'错误求助
解决AnyLogic中「Duplicate local variable self」编译错误
问题描述
开发模拟工厂工作站的骰子游戏模型,初始运行正常,无任何改动的情况下突然出现编译错误:
错误信息:Duplicate local variable self。位置:Dice_Game_DtC/Main - Agent Type
定位到错误来自AnyLogic自动生成的Main.java代码,而非自定义代码。回退到正常版本并逐步添加改动后模型恢复正常,但几天后错误再次复发。模型为事件驱动架构,部分事件(如Pay_Costs、Define_Downs)的生成代码中,AnyLogic重复定义了名为self的变量,引发冲突。
以下是出现问题的事件代码示例:
if ( _e == Pay_Costs ) { EventTimeout self = _e; //我的代码如下 Fixed_Costs_Round=Fixed_Cap_Cost; Fixed_Cap_Costs_Payed.add(Fixed_Costs_Round); Total_Fixed_Costs=Total_Fixed_Costs+Fixed_Costs_Round; Total_Inv_Round=Total_WIP+Available_Finished_Prd; Total_Inv_per_Round.add(Total_Inv_Round); Invent_Cost_Round= Total_Inv_Round/Num_Players; Invent_Cost_per_Round.add(Invent_Cost_Round); Total_Invent_Costs=Total_Invent_Costs+Invent_Cost_Round //我的代码结束 ; return; } if ( _e == Define_Downs ) { EventTimeout self = _e; //我的代码如下 //1. 始终为Player 1设置无停机时间 for (int i = 1; i <= Num_ROUNDS; i ++){ Downtimes_P1.add(i,0); Downtimes_ME_P1.add(i,0); Downtimes_MA_P1.add(i,0); Downtimes_HU_P1.add(i,0);}; //2. 为所有玩家的第1、2轮设置无停机时间 for (int i = 1; i < Num_Players; i ++){ //从1开始是因为索引0是已设置好的P1 Downtimes_Datasets.get(i).add(1,0); Downtimes_Datasets.get(i).add(2,0); MA_Downs.get(i).add(1,0); MA_Downs.get(i).add(2,0); HU_Downs.get(i).add(1,0); HU_Downs.get(i).add(2,0); ME_Downs.get(i).add(1,0); ME_Downs.get(i).add(2,0); }; //3. 为除Player 1外的所有玩家、除第1、2轮外的所有轮次定义停机时间——每2轮设置一次 for (int i = 1; i < Num_Players; i ++){ //从1开始以忽略索引0的Player 1 for (int y = 3; y < Num_ROUNDS; y +=2){ //y代表轮次 //首先定义各环节(机器、方法、人员)的停机状态 double down_value_ma=uniform(0,1);//MACHINE if (down_value_ma<DWT_Machine_Prob) down_value_ma =1; else down_value_ma =0; MA_Downs.get(i).add(y,down_value_ma); MA_Downs.get(i).add(y+1,down_value_ma); double down_value_me=uniform(0,1);//METHOD if (down_value_me<DWT_Method_Prob) down_value_me =1; else down_value_me =0; ME_Downs.get(i).add(y,down_value_me); ME_Downs.get(i).add(y+1,down_value_me); double down_value_hu=uniform(0,1);//HUMAN if (down_value_hu<DWT_Human_Prob) down_value_hu =1; else down_value_hu =0; if (y>=HeadC_Inv_Round) down_value_hu=0;//若该轮有HeadC投资,则将停机时间设为0 HU_Downs.get(i).add(y,down_value_hu); if (y+1==HeadC_Inv_Round) HU_Downs.get(i).add(y+1,0) ; else HU_Downs.get(i).add(y+1,down_value_hu);//若下一轮为投资轮次,直接设为0 //若任一环节停机,则工作站停机 int down_value; if (down_value_ma==1||down_value_me==1||down_value_hu==1) down_value=1; else down_value=0; Downtimes_Datasets.get(i).add(y,down_value); Downtimes_Datasets.get(i).add(y+1,down_value);};} //我的代码结束 ; return; }
解决方案
1. 清理生成代码缓存
- 关闭当前模型,找到模型所在目录下的
gen文件夹(AnyLogic自动生成Java代码的目录) - 删除
gen文件夹内的所有文件及子文件夹 - 重新打开模型,AnyLogic会重新生成干净的代码文件,避免旧缓存的残留冲突
2. 修复自定义代码的语法错误
- 检查所有事件中的自定义代码,确保语法完整:比如示例中
Pay_Costs事件的最后一行Total_Invent_Costs=Total_Invent_Costs+Invent_Cost_Round缺少分号,这类小错误会干扰AnyLogic的代码生成逻辑,导致内部变量重复定义 - 逐一排查循环、条件语句的括号闭合情况,确保代码结构完整
3. 重置异常事件
- 针对反复出现问题的事件(如
Pay_Costs、Define_Downs),可以删除原有事件,重新创建一个新的同类型事件,再将原代码复制到新事件中,避免事件的内部配置损坏
4. 更新AnyLogic到稳定版本
- 这类间歇性的代码生成错误可能是软件版本的已知bug,安装最新的官方稳定版本,修复已知的代码生成逻辑问题
内容的提问来源于stack exchange,提问作者Beatriz Valladão
相关产品推荐
相关产品推荐

