Java:case表达式必须是常量表达式

时间:2017-06-10 06:52:57

标签: java

我正在使用带有值的枚举,当我尝试在切换案例中使用SmartCard.MessageType.SC_CONN.getValue()时,我收到错误

  

案例表达式必须是常量表达式

public class SmartCard {
    public enum MessageType {
        /** 0x00 Acknowledge of message */
        SC_ACKP(0),
        /** 0x01 Connect to the smart card */
        SC_CONN(1),
        /** 0x02 Request ATR attributes of smart card */
        SC_ATTR(2),
        /** 0x03 Send data to smart card */
        SC_SEND(3);

        private int value;

        MessageType(int value) {
            this.value = value;
        }


        public int getValue() {
            return this.value;
        }

    };

    }

public class TCPServer {

public static void main(String args[]) throws Exception {
      }
    private static void handleMessage(int packetType, int dataLen, byte[] receiveMessage, Socket clientSocket,
            SmartCard smartCard) {
        ByteBuffer answerBuffer = null;
        int value = SmartCard.MessageType.SC_CONN.getValue();
        String preferredProtocol = "";
        switch (packetType) {
        case 0:
            break;
        case value:
            break;
        case 2: 

        }

    }
}

2 个答案:

答案 0 :(得分:0)

在Java中,case语句必须是编译时常量,而value不是,它是在运行时分配的。

答案 1 :(得分:0)

switch语句的第二种情况写错了。 value不能在这里使用。每个案例的价值必须是不变的。让我们看看JLS说的是什么。

Section 14.11

SwitchStatement:
    switch ( Expression ) SwitchBlock

SwitchBlock:
    { SwitchBlockStatementGroupsopt SwitchLabelsopt }

SwitchBlockStatementGroups:
    SwitchBlockStatementGroup
    SwitchBlockStatementGroups SwitchBlockStatementGroup

SwitchBlockStatementGroup:
    SwitchLabels BlockStatements

SwitchLabels:
    SwitchLabel
    SwitchLabels SwitchLabel

SwitchLabel:
    case ConstantExpression :
    case EnumConstantName :
    default :

EnumConstantName:
    Identifier

查看SwitchLabel的定义。 case之后的内容必须是ConstantExpressionEnumConstantNamevalue不是那些。

此问题的一个解决方案是使用if...else if...else语句。

if (packetType == 0) {

} else if (packetType == value) {

} else if (packetType == 2) {

}

如果你真的想保留switch语句,请在默认分支中执行if。

switch (packetType) {
case 0:
    break;
case 2: 
    break;
default:
    if (packetType == value) { ... }
    break;
}