代码创建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
相关产品推荐
相关产品推荐

