2

我四处走动并尝试在开关盒中使用枚举。但很明显,我做错了什么。

这是我定义枚举的代码:

public class WorkoutStopwatch extends Activity implements OnClickListener {

    private boolean timer_running = false;
    public enum CounterState {
        WORKOUT, REST
    }
    CounterState state;

以及我使用它的重写 onClick 方法:

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.start_button:
            timer_running = true;
            // Make call to timer update class to start
            break;
        case R.id.stop_button:
            timer_running = false;
            // Make call to timer update class to stop
            break;
        case R.id.reset_button:

            if (!timer_running) {
                switch(state) {
                case WORKOUT:
                    // TODO: Reset the counter to the workout time
                    break;
                case REST:
                    // TODO: Reset the counter to the rest time
                    break;
                }
            }
            break;
        }
    }

当我运行我的程序时,启动和停止按钮的 onClick 调用工作得很好,但是重置按钮会导致应用程序崩溃,并出现指向开关行的“FATAL EXCEPTION: main”和“java.lang.NullPointerException”错误. 从我一直在阅读的内容来看,读取开关时枚举的值可能为空,因此我将枚举声明更改为:

    private enum CounterState {
        UNKNOWN(0),
        WORKOUT(1), 
        REST(2);

        private int stateValue;

        CounterState(int state) {
            this.stateValue = state;
        }

        public int getStateValue() {
            return stateValue;
        }

        public void setStateValue(int state) {
            this.stateValue = state;
        }       
    }

    CounterState state;

我同意,看起来像一个更完整的定义,但仍然存在问题。留下这样的代码并不能解决问题,读取时状态似乎仍然为空。在对象的声明中添加一个 int,如下所示:

CounterState state(0);

给我一个 Eclipse 错误“令牌“0”上的语法错误,删除此令牌”。所以我有点迷路了。据我所知,现在有一个枚举的构造函数,我应该能够传递一个 int 来初始化它在创建时的值,但这似乎不起作用。

4

3 回答 3

4

您是否尝试过state在使用变量之前对其进行初始化?

CounterState state = CounterState.UNKNOWN;
于 2013-09-03T15:12:54.240 回答
0

空指针异常仅在您之前使用该变量或未对其进行初始化时出现。因此,首先检查您在此处使用的所有变量及其初始化步骤。自己做,这样以后你就不会犯这种错误了。

于 2013-09-03T15:27:03.923 回答
0

可能您的错误原因是:
“v.getId()”为空。

于 2018-11-29T09:55:42.330 回答