调用AGV.getDistanceTravelled()获取行驶距离报静态引用错误
报错根因
这个报错的核心问题是方法调用的对象层级搞错了:
getDistanceTravelled(Length Units)是单个AGV智能体实例的非静态方法,返回值是某一台具体AGV的实际行驶距离,这个方法只和仿真运行中生成的实体AGV绑定,和AGV这个类模板本身没有关联- 你写的
AGV.getDistanceTravelled(METER);是直接通过AGV类名调用方法,属于静态调用实例方法,AnyLogic底层基于Java实现,不允许这种调用逻辑,因此抛出错误。
你遇到的具体报错信息如下:
Cannot make a static reference to the non-static method getDistanceTravelled(Length Units) from the type AGV.
(报错含义:无法对AGV类的非静态方法getDistanceTravelled(Length Units)进行静态引用)
仿真结束统计AGV行驶距离的正确实现
要统计所有AGV的行驶距离,不能直接用类名调用方法,必须遍历OrderFleet车队中实际生成的每一台AGV实体,逐个调用距离统计方法后累加结果。
常规场景实现(无AGV中途销毁逻辑)
如果你的模型里AGV生成后会一直存活到仿真结束,按以下步骤操作即可:
- 确认main主智能体中,你创建的运输车队对象名称和命名一致,为
OrderFleet - 打开main智能体的
On destroy(销毁时触发)逻辑块,替换原有错误代码为以下内容:
// 初始化总距离统计变量,单位为米 double totalAgvDistance = 0; // 遍历OrderFleet车队下的所有AGV实例 for (AGV agv : OrderFleet.agents()) { // 逐个累加单台AGV的行驶距离 totalAgvDistance += agv.getDistanceTravelled(METER); } // 如需在控制台打印统计结果,可放开下方代码注释 // traceln("仿真结束,所有AGV累计行驶距离:" + totalAgvDistance + "米");
特殊场景适配(存在AGV中途销毁逻辑)
如果你的模型里有AGV完成任务后被销毁的逻辑,上述写法会漏掉已销毁AGV的行驶距离,需要补全统计逻辑:
- 先在main主智能体中定义一个
double类型的全局变量agvAccumulatedDistance,初始值设为0 - 打开AGV智能体的
On destroy逻辑块,写入代码:main.agvAccumulatedDistance += this.getDistanceTravelled(METER);,确保每台AGV销毁时就把自己的行驶距离提前累加到全局变量里 - 最后在main的
On destroy逻辑中,把遍历存活AGV得到的总距离,加上提前统计的agvAccumulatedDistance,就是仿真全周期内所有AGV的真实累计行驶距离。
补充说明
如果只需要获取单台特定AGV的行驶距离,也要先拿到对应的AGV实例再调用方法,比如通过OrderFleet.getAgentById(目标AGV的ID)拿到指定AGV对象后,再调用getDistanceTravelled()方法即可,永远不要直接用AGV类名调用这个实例方法。
内容的提问来源于stack exchange,提问作者alyre
相关产品推荐
相关产品推荐

