我正在制作游戏,我希望控件可以编辑。好吧,我已经把那部分放下了,但它们正在.txt文件中被读取和更改。这就是我希望它现在工作的方式。值存储为键值(即KeyEvent.VK_W等于83,因此该行的值为83)。我也让它读取值并将它们保存到我的核心类中的String数组变量中。在我的键事件类中,处理键的推送,我让它引用数组来检查是否按下了命令键。我不断收到此错误:case expressions must be constant expressions
当我尝试它时。这是错误的代码:
switch(key){
case Integer.parseInt(commands[1]):
...
break;
}
我得到了那个错误。 commands[1]
的值是83.它是“W”的值。这是我对变量的声明:
for (int i = 0; i < commands.length; i++) {
commands[i] = io.readSpecificLine(FILES.controlsFileFinalDir,
i + 1);
}
如果我打印出每个值,它确实有效。我已经尝试制作数组final
但是没有用。我大约在2年前遇到了解决方案,但我再也找不到了。有没有人有任何想法如何解决这个问题?提前谢谢!
答案 0 :(得分:4)
正如编译器所说,case表达式必须是常量表达式。您不能将数组元素用作案例表达式。您只需使用if
/ else if
/ else
子句即可。
答案 1 :(得分:1)
您不能在case
语句中使用非常量表达式。另一种方法是构建从值到动作的映射。所以不是这个(对我来说实际上没有任何意义):
switch (key) {
case Integer.parseInt(commands[1]):
// action 1
break;
// other cases...
default:
// default action
}
您可以这样做:
static Map<Integer, Runnable> keyMap = new HashMap<Integer, Runnable>();
static {
keyMap.put(83, new Runnable() {
@Override
public void run() {
// actions for code 83
}
});
. . .
}
(如果更有意义,这也可以基于每个实例而不是静态地图完成。)然后:
Runnable action = keyMap.get(Integer.parseInt(commands[1]));
if (action != null) {
action.run();
} else {
// default action
}
如果您需要将变量传递给您的操作,则可以定义自己的界面,而不是使用Runnable
来执行操作。