Java SCXML,我可以';不要在事件内部使用fireEvent
我正在使用ApacheCommonsSCXML创建一个FSM。使用Apache中的秒表示例,我创建了一个FSM SCXML:Java SCXML,我可以';不要在事件内部使用fireEvent,java,apache-commons,scxml,apache-commons-scxml,Java,Apache Commons,Scxml,Apache Commons Scxml,我正在使用ApacheCommonsSCXML创建一个FSM。使用Apache中的秒表示例,我创建了一个FSM SCXML: <scxml initial="Iddle" version="0.9" xmlns="http://www.w3.org/2005/07/scxml"> <state id="Iddle"> <transition event="continueDriving" target="DriveForward"></transi
<scxml initial="Iddle" version="0.9" xmlns="http://www.w3.org/2005/07/scxml">
<state id="Iddle">
<transition event="continueDriving" target="DriveForward"></transition>
</state>
<state id="DriveForward">
<transition event="continueDriving" target="DriveForward"></transition>
<transition event="detectingWall" target="DetectWall"></transition>
<transition event="lowBattery" target="Disconnect"></transition>
</state>
<state id="DetectWall">
<transition event="continueDriving" target="DriveForward"></transition>
<transition event="lowBattery" target="Disconnect"></transition>
</state>
<final id="Disconnect"></final>
</scxml>
金融稳定机制:
包jab.lejos.liverobots.brity.fsm;
导入jab.lejos.liverobots.brity.model.RobotSimulated;
导入java.io.File;
导入java.net.MalformedURLException;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.List;
导入java.util.Set;
导入org.apache.commons.scxml.env.AbstractStateMachine;
导入org.apache.commons.scxml.model.State;
导入org.apache.commons.scxml.model.Transition;
导入org.apache.log4j.Logger;
/**
*
*基于此示例:
* http://commons.apache.org/proper/commons-scxml/xref-test/org/apache/commons/scxml/env/StopWatch.html
*
*@作者jabrena
*
*/
公共类BrityFSM4扩展了AbstractStateMachine{
Logger Logger=Logger.getLogger(BrityFSM4.class);
私有静态最终字符串SCXML_CONFIG=“./lib/BrityModel.SCXML”;
私人机器人;模拟机器人;
public BrityFSM4()引发错误的DurException{
super(新文件(SCXML_CONFIG.toURI().toul());
robot=RobotSimulated.getInstance();
}
//用户方法
公共字符串getCurrentStateId(){
设置状态=getEngine().getCurrentStatus().getStates();
State State=(State)states.iterator().next();
返回state.getId();
}
公共状态getCurrentState(){
设置状态=getEngine().getCurrentStatus().getStates();
返回((State)states.iterator().next());
}
公共集合getCurrentStateEvents(){
返回getEngine().getCurrentStatus().getEvents();
}
//有限状态机方法
公开无效Iddle(){
Logger Logger=Logger.getLogger(BrityFSM4.class);
logger.info(“STATE:Iddle”);
//this.firevent(brityfsmttransitions.continuedDriving.toString());
列表=新的ArrayList();
List transitionList=this.getCurrentState().GetTransitionList();
if(transitionList.size()>0){
list.clear();
for(转换:transitionList){
添加(transition.getEvent());
logger.info(“事件:+transition.getEvent());
}
}
}
公共无效驱动器转发(){
logger.info(“状态:DriveForward”);
}
公共void DetectWall(){
logger.info(“状态:DetectWall”);
}
公共空间断开连接(){
//TODO改进log4j的使用
logger.info(“状态:断开”);
}
}
我的问题是,为什么在FSM类中,我不能执行该方法:
//this.fireEvent(BrityFSMTransitions.continueDriving.toString());
public void Iddle() {
Logger logger = Logger.getLogger(BrityFSM4.class);
logger.info("STATE: Iddle");
//this.fireEvent(BrityFSMTransitions.continueDriving.toString());
List<String> list = new ArrayList<String>();
List<Transition> transitionList = this.getCurrentState().getTransitionsList();
if(transitionList.size() > 0){
list.clear();
for (Transition transition : transitionList) {
list.add(transition.getEvent());
logger.info("EVENT: " + transition.getEvent());
}
}
}
//this.firefevent(brityfsmtransformations.continuedDriving.toString());
公开无效Iddle(){
Logger Logger=Logger.getLogger(BrityFSM4.class);
logger.info(“STATE:Iddle”);
//this.firevent(brityfsmttransitions.continuedDriving.toString());
列表=新的ArrayList();
List transitionList=this.getCurrentState().GetTransitionList();
if(transitionList.size()>0){
list.clear();
for(转换:transitionList){
添加(transition.getEvent());
logger.info(“事件:+transition.getEvent());
}
}
}
但如果我在主程序中执行方法,我不会有任何问题
任何想法
当前控制台:
2013-10-05 19:00:10,463 INFO [main] (BrityFSM4.java:57) - STATE: Iddle
2013-10-05 19:00:10,469 ERROR [main] (AbstractStateMachine.java:298) -
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.commons.scxml.env.AbstractStateMachine.invoke(AbstractStateMachine.java:256)
at org.apache.commons.scxml.env.AbstractStateMachine$EntryListener.onEntry(AbstractStateMachine.java:312)
at org.apache.commons.scxml.NotificationRegistry.fireOnEntry(NotificationRegistry.java:130)
at org.apache.commons.scxml.NotificationRegistry.fireOnEntry(NotificationRegistry.java:114)
at org.apache.commons.scxml.semantics.SCXMLSemanticsImpl.executeActions(SCXMLSemanticsImpl.java:247)
at org.apache.commons.scxml.SCXMLExecutor.reset(SCXMLExecutor.java:252)
at org.apache.commons.scxml.SCXMLExecutor.go(SCXMLExecutor.java:351)
at org.apache.commons.scxml.env.AbstractStateMachine.initialize(AbstractStateMachine.java:184)
at org.apache.commons.scxml.env.AbstractStateMachine.<init>(AbstractStateMachine.java:132)
at org.apache.commons.scxml.env.AbstractStateMachine.<init>(AbstractStateMachine.java:103)
at jab.lejos.liverobots.brity.fsm.BrityFSM4.<init>(BrityFSM4.java:34)
at jab.lejos.liverobots.brity.BrityFSMTest4.<init>(BrityFSMTest4.java:34)
at jab.lejos.liverobots.brity.BrityFSMTest4.main(BrityFSMTest4.java:28)
Caused by: java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at jab.lejos.liverobots.brity.fsm.BrityFSM4.getCurrentState(BrityFSM4.java:47)
at jab.lejos.liverobots.brity.fsm.BrityFSM4.Iddle(BrityFSM4.java:60)
... 17 more
2013-10-05 19:00:10463信息[main](BrityFSM4.java:57)-状态:Iddle
2013-10-05 19:00:10469错误[main](AbstractStateMachine.java:298)
java.lang.reflect.InvocationTargetException
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.apache.commons.scxml.env.AbstractStateMachine.invoke(AbstractStateMachine.java:256)
位于org.apache.commons.scxml.env.AbstractStateMachine$EntryListener.onEntry(AbstractStateMachine.java:312)
位于org.apache.commons.scxml.NotificationRegistry.fireonetry(NotificationRegistry.java:130)
位于org.apache.commons.scxml.NotificationRegistry.fireonetry(NotificationRegistry.java:114)
位于org.apache.commons.scxml.semantics.SCXMLSemanticsImpl.executeActions(SCXMLSemanticsImpl.java:247)
位于org.apache.commons.scxml.SCXMLExecutor.reset(SCXMLExecutor.java:252)
位于org.apache.commons.scxml.SCXMLExecutor.go(SCXMLExecutor.java:351)
位于org.apache.commons.scxml.env.AbstractStateMachine.initialize(AbstractStateMachine.java:184)
位于org.apache.commons.scxml.env.AbstractStateMachine。(AbstractStateMachine.java:132)
位于org.apache.commons.scxml.env.AbstractStateMachine。(AbstractStateMachine.java:103)
在jab.lejos.liverobots.brity.fsm.BrityFSM4.(BrityFSM4.java:34)
在jab.lejos.liverobots.brity.brityfsmt4.(brityfsmt4.java:34)
在jab.lejos.liverobots.brity.brityfsmt4.main(brityfsmt4.java:28)
原因:java.util.NoSuchElementException
位于java.util.HashMap$HashIterator.nextery(HashMap.java:796)
在java.util.HashMap$KeyIterator.next(HashMap.java:828)
在jab.lejos.liverobots.brity.fsm.BrityFSM4.getCurrentState(BrityFSM4.java:47)
在jab.lejos.liverobots.brity.fsm.BrityFSM4.Iddle(BrityFSM4.java:60)
... 还有17个
我通过仔细阅读API解决了这个问题。解决方案:嗨@jabrena,你应该把它作为公认的答案发布。顺便说一句,伟大的项目!
//this.fireEvent(BrityFSMTransitions.continueDriving.toString());
public void Iddle() {
Logger logger = Logger.getLogger(BrityFSM4.class);
logger.info("STATE: Iddle");
//this.fireEvent(BrityFSMTransitions.continueDriving.toString());
List<String> list = new ArrayList<String>();
List<Transition> transitionList = this.getCurrentState().getTransitionsList();
if(transitionList.size() > 0){
list.clear();
for (Transition transition : transitionList) {
list.add(transition.getEvent());
logger.info("EVENT: " + transition.getEvent());
}
}
}
2013-10-05 19:00:10,463 INFO [main] (BrityFSM4.java:57) - STATE: Iddle
2013-10-05 19:00:10,469 ERROR [main] (AbstractStateMachine.java:298) -
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.commons.scxml.env.AbstractStateMachine.invoke(AbstractStateMachine.java:256)
at org.apache.commons.scxml.env.AbstractStateMachine$EntryListener.onEntry(AbstractStateMachine.java:312)
at org.apache.commons.scxml.NotificationRegistry.fireOnEntry(NotificationRegistry.java:130)
at org.apache.commons.scxml.NotificationRegistry.fireOnEntry(NotificationRegistry.java:114)
at org.apache.commons.scxml.semantics.SCXMLSemanticsImpl.executeActions(SCXMLSemanticsImpl.java:247)
at org.apache.commons.scxml.SCXMLExecutor.reset(SCXMLExecutor.java:252)
at org.apache.commons.scxml.SCXMLExecutor.go(SCXMLExecutor.java:351)
at org.apache.commons.scxml.env.AbstractStateMachine.initialize(AbstractStateMachine.java:184)
at org.apache.commons.scxml.env.AbstractStateMachine.<init>(AbstractStateMachine.java:132)
at org.apache.commons.scxml.env.AbstractStateMachine.<init>(AbstractStateMachine.java:103)
at jab.lejos.liverobots.brity.fsm.BrityFSM4.<init>(BrityFSM4.java:34)
at jab.lejos.liverobots.brity.BrityFSMTest4.<init>(BrityFSMTest4.java:34)
at jab.lejos.liverobots.brity.BrityFSMTest4.main(BrityFSMTest4.java:28)
Caused by: java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at jab.lejos.liverobots.brity.fsm.BrityFSM4.getCurrentState(BrityFSM4.java:47)
at jab.lejos.liverobots.brity.fsm.BrityFSM4.Iddle(BrityFSM4.java:60)
... 17 more