尝试为另一个类中的枚举实现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;
}
答案 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.ACK
,
OtherClass.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将包含您搜索的字节的相应枚举值,您可以打开它。