我正在使用带有值的枚举,当我尝试在切换案例中使用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:
}
}
}
答案 0 :(得分:0)
在Java中,case语句必须是编译时常量,而value
不是,它是在运行时分配的。
答案 1 :(得分:0)
switch语句的第二种情况写错了。 value
不能在这里使用。每个案例的价值必须是不变的。让我们看看JLS说的是什么。
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
之后的内容必须是ConstantExpression
或EnumConstantName
。 value
不是那些。
此问题的一个解决方案是使用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;
}