2017-06-10 14 views
0

でなければならない、私は値を持つ列挙型を使用していると私は、スイッチケースにSmartCard.MessageType.SC_CONN.getValue()を使用しようとすると、私はのJava:case式は定数式

ケース式は定数式

でなければならないエラーを取得しています
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: 

     } 

    } 
} 
+1

'case value:'が問題ですが、case文で変数を使用することはできません。 –

答えて

0

Javaでは、case文はコンパイル時定数でなければならず、valueは実行時に割り当てられます。

+0

はコメントにする必要があります。 –

+2

@jackjay私は同意しない。これは確かに質問に答える。何かあれば、_your_コメントは回答であったはずです。 –

0

switch文の2番目の場合が間違って書き込まれます。 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以降のものは、ConstantExpressionまたはEnumConstantNameのいずれかでなければなりません。 valueはそれらのどちらでもありません。

この問題の解決策の1つはif...else if...elseステートメントを使用することです。

if (packetType == 0) { 

} else if (packetType == value) { 

} else if (packetType == 2) { 

} 

本当にswitch文を保持したい場合は、デフォルトのブランチにチェックインしてください。

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