You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码创建Level时调用PedSource.inject()触发NullPointerException求助

问题分析与解决方案

核心原因

你的推测完全正确:PedSource组件默认处于模型的主层级(main),但你通过代码创建了独立的新Level对象,导致行人所在层级与墙体所在层级不统一。AnyLogic的行人路径规划系统依赖层级内的障碍数据,跨层级的对象无法被识别,最终触发空指针异常。

解决方案

1. 复用模型主层级,而非创建新Level

删除手动创建Level的代码,改用模型自带的主层级:

// 替换原Level创建代码,直接获取主层级
Level level = getMainLevel();

List<Tuple> rows = selectFrom(sheet1)
    .list();

for (Tuple row : rows) {
    int xPos = row.get(sheet1.graphics_pivot_point_x);
    int yPos = row.get(sheet1.graphics_pivot_point_y);
    int shapeWidth = row.get(sheet1.graphics_width);
    int shapeHeight = row.get(sheet1.graphics_height);

    // 使用带层级参数的构造器直接创建墙体,确保关联到主层级
    RectangularWall rw = new RectangularWall(this, level, xPos, yPos, 0, shapeWidth, shapeHeight);
    rw.setVisible(true);
    rw.setOwner(this);
    
    level.add(rw);
}

// 主层级无需手动initialize和添加到presentation,已默认处理

2. 验证PedSource的层级设置

打开PedSource的属性面板,确认Level选项设置为main(模型主层级),确保行人与墙体处于同一层级。

3. 可选:若需自定义层级的注意事项

如果确实需要使用自定义层级,必须:

  • 将PedSource、PedGoTo、Sink所有行人组件的层级都设置为你创建的mylevel
  • 在创建自定义Level后,添加level.setPedestrianEnabled(true);开启行人路径规划支持

为什么手动绘制墙体正常?

手动绘制的墙体默认会被添加到模型主层级,与PedSource的层级一致,行人路径规划系统能正常识别障碍,因此不会触发异常。

内容的提问来源于stack exchange,提问作者Aaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:01:14