AnyLogic中Transporter执行存储操作后触发NullPointerException求助
AnyLogic中Store块触发NullPointerException的排查与解决思路
问题描述
我在AnyLogic模型中遇到NullPointerException错误。需求是Transporter从一处存储区取货,将货物存入A组存储区的空闲存储位,按从左到右顺序填充。因此将Store块的“Storage”属性设置为getFreeStorage函数的输出,该函数用于查找A组中最左侧的空闲存储区。运行模型时,Transporter成功取货并存入目标存储区,但离开时触发NullPointerException。
错误栈信息
Exception during discrete event execution: NullPointerException java.lang.NullPointerException at com.anylogic.libraries.modules.level_system.LevelDataStorage.getLevelData(Unknown Source) at com.anylogic.libraries.material_handling.LevelSystem.<init>(Unknown Source) at com.anylogic.libraries.material_handling.MHLSettings.c(Unknown Source) at com.anylogic.libraries.material_handling.MHLSettings.b(Unknown Source) at com.anylogic.libraries.material_handling.Store.b(Unknown Source) at com.anylogic.libraries.material_handling.Store$17.onExit(Unknown Source) at com.anylogic.libraries.modules.rack_system_module.RackPutInternal.c(Unknown Source) at com.anylogic.libraries.modules.rack_system_module.RackPutInternal$1.onExit(Unknown Source) at com.anylogic.libraries.modules.rack_system_module.RackCommandExecutor.a(Unknown Source) at com.anylogic.libraries.modules.rack_system_module.RackCommandExecutor$6.onExit(Unknown Source) at com.anylogic.libraries.processmodeling.SelectOutputOut.a(Unknown Source) at com.anylogic.libraries.processmodeling.SelectOutputOut$1.onExit(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock.c(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock$1.b(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.InPort.receiveImmediately(Unknown Source) at com.anylogic.libraries.processmodeling.InputBlock$1.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.b(Unknown Source) at com.anylogic.libraries.processmodeling.PlainTransfer$1.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.b(Unknown Source) at com.anylogic.libraries.processmodeling.PlainTransfer$1.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.b(Unknown Source) at com.anylogic.libraries.processmodeling.PlainTransfer$1.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.b(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock.forwardReadyEntityNotification(Unknown Source) at com.anylogic.libraries.processmodeling.InputBlock$1.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.b(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock.forwardReadyEntityNotification(Unknown Source) at com.anylogic.libraries.processmodeling.InputBlock$1.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.b(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock.forwardReadyEntityNotification(Unknown Source) at com.anylogic.libraries.processmodeling.InputBlock$1.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.b(Unknown Source) at com.anylogic.libraries.processmodeling.OutPort.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock$2.a(Unknown Source) at com.anylogic.libraries.processmodeling.OutputBlock$2.action(Unknown Source) at com.anylogic.libraries.processmodeling.AsynchronousExecutor_xjal$a.execute(Unknown Source) at com.anylogic.engine.LibraryEventHandler$f.execute(Unknown Source) at com.anylogic.engine.Engine.a(Unknown Source) at com.anylogic.engine.Engine.nd(Unknown Source) at com.anylogic.engine.Engine$f.run(Unknown Source)
已尝试的排查手段
- 创建新的Transporter fleet
- 直接指定具体Storage而非使用
getFreeStorage函数 - 更换不同的Transporter代理
- 让托盘自主移动(无报错,但不符合模型需求)
解决思路
1. 校验getFreeStorage函数的返回有效性
- 确保函数在任何场景下都返回非null的
Storage对象。若A组存储区全满,需添加逻辑处理(如触发模型暂停、抛出明确异常),避免null传入Store块。 - 验证函数返回的Storage是否属于正确关联的仓储系统,确认其
LevelDataStorage对象已初始化(错误栈指向该对象的getLevelData方法,说明该对象可能为null)。
2. 检查Store块的配置与后续逻辑
- 查看Store块的「On exit」或「Post-processing」事件,确认没有访问未初始化的存储区关联数据。
- 确认Transporter完成存储操作后,后续流程中引用的存储区对象未被意外销毁或置空。
3. 验证仓储系统的初始化完整性
- 检查A组存储区对应的Level System是否正确初始化,确保所有Storage对象的关联数据(如
LevelDataStorage)已正确绑定,无未初始化的情况。
4. 调试函数执行时机与对象状态
- 在
getFreeStorage函数中添加日志输出,记录每次返回的Storage对象ID与状态,确认Transporter离开时该对象是否仍有效(未被提前回收或释放)。
内容的提问来源于stack exchange,提问作者Francisco Marques
相关产品推荐
相关产品推荐

