Java ScheduledExecutorService仅使用switch语句执行一次

Java ScheduledExecutorService仅使用switch语句执行一次,java,scheduled-tasks,runnable,scheduledexecutorservice,Java,Scheduled Tasks,Runnable,Scheduledexecutorservice,我有一个对我来说很奇怪的问题。我实现了Runnable,将使用ScheduledExecutorService执行。问题是,它只执行一次 下面是有用的代码(ev是一个枚举): 有趣的是,如果我用一些if-else语句替换这个开关,它工作得很好,这意味着这个Runnable按照我的要求每50毫秒执行一次 private class MenuEventsListener implements Runnable { @Override public void run() {

我有一个对我来说很奇怪的问题。我实现了
Runnable
,将使用
ScheduledExecutorService
执行。问题是,它只执行一次

下面是有用的代码(
ev
是一个枚举):

有趣的是,如果我用一些if-else语句替换这个开关,它工作得很好,这意味着这个Runnable按照我的要求每50毫秒执行一次

private class MenuEventsListener implements Runnable    {
    @Override
    public void run() {
        System.out.println("Next iteration...");
        if (ev == MenuEvents.DESIGNER)
            foo();
        else if (ev == MenuEvents.EXIT) {
            dispose();
            System.exit(0);
        }
        ev = MenuEvents.ENUM_LAST;      
    }
}
以下是计划设置:

    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new MenuEventsListener(), 
            0, 50, TimeUnit.MILLISECONDS);
为什么用if-else语句每50ms调用一次Runnable,为什么用switch只调用一次

编辑:由于您的提问,以下是MenuEvents和ev的声明:

public enum MenuEvents  { 
    DESIGNER, CONFIG, ABOUT, BACKMENU, EXIT, ENUM_LAST
};
public MenuEvents;

是的,使用
ENUM_LAST
我试图复制C约定,但在那里我也使用它作为一种
NULL
值。

我没有看到您的完整代码,但我非常确定ev变量在第一次执行Runnable时为NULL

结果,switch语句抛出一个NullPointerException,它将终止线程


在if-else块的情况下,if块或else-if块都不会被执行,并且finally ev被分配了ENUM_LAST的值。

我编辑了我的问题以提高精度
public enum MenuEvents  { 
    DESIGNER, CONFIG, ABOUT, BACKMENU, EXIT, ENUM_LAST
};
public MenuEvents;