Java SCXML,我可以';不要在事件内部使用fireEvent

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

我正在使用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"></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