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

在Jess规则中调用Java的flip()方法触发JESS Exception问题求助

解决Jess规则中调用Java类flip()方法的报错问题

这个报错的核心原因很明确:你在Jess规则里使用(call flip)时,没有明确指定要调用方法的对象实例。Jess的call函数需要知道要操作哪个具体的Light或Door对象,否则无法识别目标方法,就会抛出JESS Exception: expected method name的异常。

正确的规则写法

我们需要先通过变量绑定匹配到的事实(也就是对应的Java对象实例),再调用该实例的flip()方法。修改后的规则如下:

开关灯规则

(defrule switch-light "rule to switch light state"
  ?light <- (Light {lightOn == FALSE})  ; 将匹配到的Light对象绑定到?light变量
  =>
  (call ?light flip)  ; 调用?light实例的flip()方法
  (printout t "the lamp is on" crlf)
)

开门规则

(defrule open-door "rule to open a door"
  ?door <- (Door {open == FALSE})  ; 将匹配到的Door对象绑定到?door变量
  =>
  (call ?door flip)  ; 调用?door实例的flip()方法
  (printout t "the door is open" crlf)
)

对应修改Java代码中的规则加载部分

把上面的规则整合到你的Java代码里,调整字符串拼接即可:

// RULES
ENGINE.eval("(defrule switch-light \"rule to switch light state\" ?light <- (Light {lightOn == FALSE}) => " + 
            "(call ?light flip)(printout t \"the lamp is on\" crlf))");
ENGINE.eval("(defrule open-door \"rule to open a door\" ?door <- (Door {open == FALSE}) => " + 
            "(call ?door flip)(printout t \"the door is open\" crlf))");

原理说明

你已经通过deftemplate声明了和Java类绑定的模板:

ENGINE.eval("(deftemplate Light (declare (from-class ro.domoticbot.data.Light)))");
ENGINE.eval("(deftemplate Door (declare (from-class ro.domoticbot.data.Door)))");

所以当Jess匹配到(Light {lightOn == FALSE})这样的事实时,?light变量就会指向对应的Light类实例,调用(call ?light flip)就会直接执行该Java对象的flip()方法,正确修改其状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:47:10