AnyLogic中Batch块属性继承与NullPointerException问题排查
核心问题定位与解决步骤
1. 先解决最常见的根源:ProcessData集合未初始化
空指针大概率是因为Box Agent的processData列表只声明没初始化。在Box Agent的属性定义里,必须把集合初始化为实例:
// 在Box Agent的属性区域定义 List<ProcessData> processData = new ArrayList<>();
如果只写List<ProcessData> processData;,box.getProcessData()会返回null,调用add()或getLast()必然触发空指针。
2. 修正代码的Agent上下文寻址
你之前的代码错误在于没搞清楚不同块里的Agent变量指代:
Delay块进入代码:Delay块处理的是Batch Agent,要操作Batch里的每个Box,必须遍历Batch的成员集合,代码改成:
// 遍历Batch中的所有Box Agent,逐个添加处理起始数据 for(Box box : (List<Box>)agent.getMembers()){ box.getProcessData().add(new ProcessData(date(), duration())); }这里的
agent是当前的Batch Agent,通过getMembers()获取所有被打包的Box。Unbatch块进入代码:Unbatch块拆分后,上下文里的
agent就是单个Box Agent,代码改成:agent.getProcessData().getLast().setEnd(date());直接用
agent指代当前被拆分出来的Box,不要再用box.(该上下文中无此变量)。
3. 理解Batch/Unbatch的Agent独立性
Batch块生成的Batch Agent是临时独立的,和原始Box Agent没有属性继承关系。所有原始Box都被存在Batch Agent的members集合中,必须通过遍历这个集合才能操作每个Box,不能直接用Batch的属性关联Box。
4. Unbatch块onExit方法的错误翻译
你提到的第二个错误代码public void onExit( Box batch, Box agent ) { _unbatch_onExit_xjal( this, batch, agent ); }翻译成中文为:
public void 退出时处理( Box 批处理代理, Box 单个代理 ) { _unbatch_onExit_xjal( this, 批处理代理, 单个代理 ); }
这是AnyLogic自动生成的回调方法,参数里的batch是被拆分的Batch Agent,agent是拆分出的单个Box,操作单个Box必须使用agent参数。
内容的提问来源于stack exchange,提问作者name123

