Java 大小写表达式必须是常量表达式

Java 大小写表达式必须是常量表达式,java,syntax-error,Java,Syntax Error,我有一个任务是建立一个游戏bord。。。 我希望用户将程序放入他想要玩的键中。 问题是Java要求​​在开关的情况下,将是const。。。 这样做的目的是为KeyListener创建一个类型继承,然后我将它添加到其适当的播放器中 所需密钥作为参数int[]Keys 我见过一些人通过添加“static final”来提供类似问题的解决方案,不幸的是,它没有帮助 这是我的密码: import java.awt.event.KeyEvent; import java.awt.event.KeyList

我有一个任务是建立一个游戏bord。。。 我希望用户将程序放入他想要玩的键中。 问题是Java要求​​在开关的情况下,将是const。。。 这样做的目的是为KeyListener创建一个类型继承,然后我将它添加到其适当的播放器中

所需密钥作为参数
int[]Keys

我见过一些人通过添加“static final”来提供类似问题的解决方案,不幸的是,它没有帮助

这是我的密码:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class PlayerKeyListener implements KeyListener
{

int[] keys;
int playerID;

PlayerKeyListener(int[] keys, int playerID)
{
    this.keys = keys;
    this.playerID = playerID;
}

public void keyPressed(KeyEvent e) 
{ 
    System.out.println("keyPressed code : "+ e.getKeyCode());
    switch (e.getKeyCode()) 
    {
    case keys[KeyboardSettings.UP]:     gameBord.players[playerID].moveUp(); break;
    case keys[KeyboardSettings.DOWN]:   gameBord.players[playerID].moveDown(); break;   
    case keys[KeyboardSettings.LEFT]:   gameBord.players[playerID].moveLeft(); break;
    case keys[KeyboardSettings.RIGHT]:  gameBord.players[playerID].moveRight(); break;
    case keys[KeyboardSettings.BOMB]:   gameBord.players[playerID].addBomb(); break;

    default: gameBord.players[playerID].face = 0;
    }
    e.consume();

}

public void keyReleased(KeyEvent e) 
{
    System.out.println("keyReleased code : "+ e.getKeyCode());
    gameBord.players[playerID].move = false;
    gameBord.players[playerID].pic = 0;
    e.consume();
}

public void keyTyped(KeyEvent e) 
{
    System.out.println("keyTyped code : "+ e.getKeyCode());
    e.consume();
}

}
tnx;)

大小写表达式必须是常量表达式

你在标题中回答了自己。在
case
关键字之后不能有变量

switch
命令的工作方式是在编译时必须知道所有案例(在
case
关键字之后的值)

switch (e.getKeyCode()) {
    case constant1: commands;
    case constant2: commands;
}
键[KeyboardSettings.UP]
不是常数,而是变量。其值在运行时已知。编译器不知道那里有什么值,并对您大喊大叫:“嘿,user3142930,我需要知道
case
关键字后面所有内容的值!”

在您的情况下,不能使用
开关
。您应该使用一系列
if-else
命令,如下所示:

// store it in a variable so you do not call the method repeatedly
final int code = e.getKeyCode(); 
// this is instead of your switch
if (code == keys[KeyboardSettings.UP]) {
    ....
} 
else if (code == keys[KeyboardSettings.DOWN]) {
    ...
} 
else if (...) {
   ...
}
其深层原因是,您希望用户可以配置这些键,因此您无法在编译时知道它们的值


如果你还没有理解我的最后一句话,你可以学习。

使用你的常量,而不是索引到数组中。否则如果可能是你唯一的选择。@Makoto,我想op希望用户可以配置密钥。如果不是,我来了!!我知道,我生你的气了。我不喜欢像“这是我的家庭作业,帮我做”这样的问题。在提取相关代码方面投入更多精力。不要为你的任务打扰我们。问一个与Java相关的问题。把代码放在这里很好,但不是所有的代码。只有这一点是必要的。然后人们会更愿意回答,而不会给你缺点。我已经为你添加了更多的解释,但你不配:)现在你应该让我修复你的问题,这样它就不会包含任何混乱。你需要使用“==”而不是仅仅使用“=”进行比较。