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

Jason中TimeSteppedEnvironment同步环境感知空指针问题求助

Jason框架TimeSteppedEnvironment空指针异常问题解决

问题背景

在使用Jason框架的TimeSteppedEnvironment实现同步环境(Agent需等待其他Agent完成动作后统一更新环境模型)时,运行阶段出现空指针异常,Agent无法获取感知,错误提示this.requests为null。

错误日志

[test1] *** ERROR in the transition system (sense). Circumstance:
  E =[+!start[source(self)], +kqml::clear_source_self([],[])[hide_in_mind_inspector,source(self)]]
  I =[]
  A =null
  MB=[]
  RP=null
  AP=null
  SE=null
  SO=null
  SI=null
  AI=null
  AE=null
  PA={}
  PI={}
  FA=[].
Creating a new C!
java.lang.NullPointerException: Cannot enter synchronized block because "this.requests" is null
    at jason.environment.TimeSteppedEnvironment.getPercepts(TimeSteppedEnvironment.java:303)
    at jason.infra.local.LocalAgArch.perceive(LocalAgArch.java:330)
    at jason.asSemantics.TransitionSystem.sense(TransitionSystem.java:1673)
    at jason.infra.local.LocalAgArch.sense(LocalAgArch.java:213)
    at jason.infra.local.LocalAgArch.reasoningCycle(LocalAgArch.java:250)
    at jason.infra.local.LocalAgArch.run(LocalAgArch.java:273)
    at java.base/java.lang.Thread.run(Thread.java:833)

相关代码片段

MAS2J项目配置

MAS test {
    environment: env.MARLEnv(1000) // timeout in milliseconds
    agents: test_agent #3;
}

ASL代码

!start.
/* Plans */
+!start : true <-
   move("down");
   !start.

自定义网格环境类

public class SwitchEnvV1 extends TimeSteppedEnvironment {
    public static final int GRID_SIZE = 5;
    private EnvModel model = null;
    private EnvView view = null;

    public SwitchEnvV1(){
        setOverActionsPolicy(OverActionsPolicy.queue);
    }
    @Override
    public void init(String[] args) {
        model = new EnvModel();
        model.setAgPos(0, 0, 0);
        model.setAgPos(1, GRID_SIZE-1, GRID_SIZE-1);
        view  = new EnvView(model);
        model.setView(view);
        clearPercepts(); // clear the percepts of the agents
    }
    @Override
    public boolean executeAction(String ag, Structure action) {
        return  model.dummy_act(ag, action);
    }
    class EnvModel extends GridWorldModel { //GridWorldModel from Jason
        private EnvModel() {
            super(GRID_SIZE, GRID_SIZE, 2);
        }
        synchronized public boolean dummy_act(String agId, Structure action){
            // synchronized as I want to update mode
            System.out.println("["+agId+"] doing: "+action);
            return true;
        }
    }
    class EnvView extends GridWorldView { //GridWorldView from Jason
        @Serial
        private static final long serialVersionUID = 1L;
        public EnvView(EnvModel model) {
            super(model, "SwitchEnvV1", 600);
            defaultFont = new Font("Arial", Font.BOLD, 18);
            setVisible(true);
            repaint();
        }

    }
}

问题原因与修复方案

1. 环境类配置错误

MAS2J配置中指定的环境类是env.MARLEnv,但实际自定义的环境类是SwitchEnvV1,导致框架加载错误,参数传递也会出现异常。

修复:修改MAS2J配置中的环境类为自定义类:

MAS test {
    environment: env.SwitchEnvV1(1000) // timeout in milliseconds
    agents: test_agent #3;
}

2. 未调用父类构造方法导致成员未初始化

TimeSteppedEnvironment中的requests变量用于存储Agent的动作请求,该变量需在父类构造中初始化。自定义环境类SwitchEnvV1的构造函数未调用父类带超时参数的构造方法,导致requests变量为null,触发空指针异常。

修复:修改SwitchEnvV1的构造函数,接收超时参数并调用父类构造:

public SwitchEnvV1(long timeout) {
    super(timeout); // 调用父类构造初始化requests等核心成员
    setOverActionsPolicy(OverActionsPolicy.queue);
}

额外优化(可选)

自定义EnvModel构造时指定支持2个Agent,但MAS2J中创建了3个Agent,后续可能出现位置设置异常,建议同步修改EnvModel的构造参数:

private EnvModel() {
    super(GRID_SIZE, GRID_SIZE, 3); // 改为支持3个Agent
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:18:17