切换编译错误

时间:2011-11-14 17:21:40

标签: java byte switch-statement bytebuffer

我已经看过其他问题但仍然无法弄明白。为什么不让它用switch语句编译这段代码?我得到错误,典型的错误“案例表达式必须是常量表达式”。我试图从消息中打开字节。由于速度问题,我想使用开关,并尝试不进行任何转换,即从int到byte。 My Utils类包含一个带有A,B,C ......的枚举PID。我想打开这些,但我收到的消息是以字节为单位。

public class SomeClass extends Thread {
    public static final byte myCase1 = (byte) Utils.PID.A.ordinal();
    public static final byte myCase2 = (byte) Utils.PID.B.ordinal();
    public static final byte myCase3 = (byte) Utils.PID.C.ordinal();

    private double[] findAllData(ByteBuffer message) {

        byte[] byteBuffer = new byte[9000];
        // parse through and find all PIDs
        for(int i=0 ;i < message.capacity(); i++) {
            message.position(i);

            switch (message.get(i)) {
            case myCase1 : break;  // Compiler errors at the case statements
            case myCase2 : break;// Compiler errors at the case statements
            case myCase3 : break;// Compiler errors at the case statements
            }
    }
}


//  Utility class
public class Utils {
    public enum PID { A,B,C };
}

2 个答案:

答案 0 :(得分:4)

即使myCase1是常量,它也不是编译时已知的常量。

相反,我会打开枚举

private static final Utils.PID[] PIDS = Utils.PID.values();

private double[] findAllData(ByteBuffer message) {

    byte[] byteBuffer = new byte[9000];
    // parse through and find all PIDs
    for (int i = 0; i < message.capacity(); i++) {
        message.position(i);

        switch (PIDS[message.get(i)]) {
            case A:
                break;
            case B:
                break;
            case C:
                break;
        }
    }

e.g。这不会起作用

private static final int NUM1 = Integer.getInteger("num1"); // from command line properties
private static final int NUM2 = Integer.getInteger("num2"); // from command line properties

switch(num) {
  case NUM1: break;
  case NUM2: break;
}

答案 1 :(得分:2)

case语句必须是编译时常量。您需要预先计算(byte) Utils.PID.A.ordinal();(以及其他两个常量),然后对其值进行硬编码。