在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
相关产品推荐
相关产品推荐

