如何使用字节转换对枚举进行SwitchStatement?

时间:2016-12-23 19:15:18

标签: java android enums switch-statement byte

尝试为另一个类中的枚举实现switch case语句。我为你们清理了无用的代码。 我的问题发生在第二行的第二个代码段。

我目前的猜测是它不喜欢枚举中的字节转换,因为它试图将其用作索引。如果是这种情况,我该如何将字节转换为要测试的索引?我应该提到我曾经使用过这种技术,但是使用标准整数铸造。例如,“值(1)”。所以我认为我理解这是如何工作的概念?但是现在我第二次猜测自己并且陷入困境。我试图将这个问题搞砸了,但是我一直在努力。

是否可以在枚举的字节转换中使用开关案例???,如果是这样,有人可以帮助我启发我的java技能,或者请指出一个更好的方法来测试我的字节。最好是除了if else语句之外的东西?我只是觉得它看起来更整洁了。

修改: 所以我似乎理解了outofbounds的问题,但这并没有回答我如何修复outofbounds仍然使用我目前的字节枚举的问题?除了为-15?

制作特定的if语句之外
public class OtherClass {
    public enum Ack_Nak{
        ACK((byte)0x01),
        NAK((byte)0x00),
        NAK_SIZE((byte)0x51),
        NAK_CRC((byte)0xCC),
        NAK_DATA((byte)0xD8),
        NAK_FILE((byte)0xF1);

        private final byte i;

        Ack_Nak(final byte i) {
            this.i = i;
        }
        public byte getByte() {
        return i;
        }
    }
}

这是我想要完成的Switch案例。我得到的错误是 “java.lang.ArrayIndexOutOfBoundsException:length = 6; index = -15”

byte ack_nak = anotherClass.getDataByte();
OtherClass.Ack_Nak Ack_Naks = OtherClass.Ack_Nak.values()[ack_nak];  // Problem Here
switch (Ack_Naks) {
    case ACK:
        //do something here
        break;
    case NAK:
    case NAK_CRC:
    case NAK_DATA:
    case NAK_FILE:
    case NAK_SIZE:
    Toast.makeText(MainActivity.this,Ack_Naks.name() , Toast.LENGTH_SHORT).show();  //show failure
    //act on the failure here
        break;
    default:  //just incase
        break;
}

2 个答案:

答案 0 :(得分:0)

这是因为您的ack_nak有价值" -15"。问题出在您的anotherClass.getDataByte()方法上,或者只使用以下代码:

byte ack_nak = anotherClass.getDataByte();
switch (ack_nak) {
    case 0x01:
        //do something here
        break;
    case 0x00:
    case 0x51:
    case 0xCC:
    case 0xD8:
    case 0xF1:
    Toast.makeText(MainActivity.this,Ack_Naks.name() , Toast.LENGTH_SHORT).show();  //show failure
    //act on the failure here
        break;
    default:  //just incase
        break;
}

如果您想使用枚举,则可以ack_nak语句检查if-else的所有可能值。

请记住,您不能在switch-case语句中使用非常量表达式!

修改

还有一个解决方案。您的anotherClass.getDataByte()方法应该返回Ack_Nak枚举的值而不是字节。然后,您可以使用如下代码:

Ack_Nak ack_nak = anotherClass.getDataByte();
switch (ack_nak) {
        case ACK:
            //do something here
            break;
        case NAK:
        case NAK_CRC:
        case NAK_DATA:
        case NAK_FILE:
        case NAK_SIZE:
            //act on the failure here
            break;
        default:  //just incase
            break;
}

答案 1 :(得分:0)

您似乎对OtherClass.Ack_Nak.values()将返回的内容有错误的认识。

它只返回一个包含所有可能值的数组。

因此OtherClass.Ack_Nak.values()[0]将包含OtherClass.Ack_Nak.ACKOtherClass.Ack_Nak.values()[1]将包含OtherClass.Ack_Nak.NAK

等等。

如果你想获得包含特定字节值的正确枚举值,你必须自己编写逻辑。

byte byteToSearch = anotherClass.getDataByte(); // the byte value to search
OtherClass.Ack_Nak foundEnum = null; // variable to hold the corresponding enum once we found it
for(OtherClass.Ack_Nak currentAckNak : OtherClass.Ack_Nak.values()) { // loop over all values
    if(currentAckNak.getByte() == byteToSearch) {
        foundEnum = currentAckNak; // if enums byte value in current iteration is the one we search for, we set the foundenum and break the loop
        break;
    }
}
if(foundEnum == null){
   throw new RuntimeException("No enum found for byte value: "+byteToSearch); // if foundEnum is still null we found no enum value for the byte and throw an exception
}

之后,findEnum将包含您搜索的字节的相应枚举值,您可以打开它。