【发布时间】:2013-09-03 15:05:44
【问题描述】:
我不顾一切地尝试在开关盒中使用枚举。但很明显,我做错了什么。
这是我定义枚举的代码:
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”错误指向该行的开关。从我一直在阅读的内容来看,读取开关时枚举的值可能为 null,因此我将枚举声明更改为:
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 来初始化它在创建时的值,但这似乎不起作用。
【问题讨论】:
-
Java 不是 C++:初始化和声明是单独的步骤(或至少是单独的语法)。如果您不分配任何内容,则该变量将具有默认值(
null,0 或 false;除非它是局部变量,否则如果您没有初始化它,您将无法访问它)。 -
感谢帮助,不习惯在两个不同的语句中声明和初始化。