2016-12-23 2 views
0

Попытка реализовать оператор case switch для перечисления, который живет в другом классе. я очистил бесполезный код для всех вас. Моя проблема возникает во втором сегменте кода во второй строке.Как сделать SwitchStatement при перечислении с байтовыми отливками?

Мое последнее предположение: ему не нравится кастинг в байтах в перечислении, потому что он пытается использовать это как индекс. Если это так, как я могу получить байт для индекса, который будет проверен? Должен упомянуть, что я использовал эту технику раньше, но со стандартным отливом. так что «значение (1)», например. Поэтому я подумал, что понимаю концепцию того, как это работает? но теперь я второй угадываю себя и завязал. Я попытался вывести сок из этой проблемы, но я продолжаю идти вверх.

Возможна ли замена случае на байтовых списках перечисления ???, если да, то кто-то может помочь с просвещением моих навыков java, или, пожалуйста, укажите мне лучший метод тестирования моего байта. желательно что-то иное, чем если бы были другие заявления? Я просто подумал, что он выглядит аккуратно с оператором switch.

EDIT: Так я, по всей видимости понять проблему outofbounds, но это не дает ответа на вопрос о том, как я идти о фиксации outofbounds по-прежнему работать с байт перечисления, я в настоящее время есть ?? кроме создания конкретной инструкции if для -15?

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; 
     } 
    } 
} 

Вот коммутатор случае я пытаюсь выполнить. ошибка я получаю "java.lang.ArrayIndexOutOfBoundsException: длина = 6; индекс = -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

Возможный дубликат [Что вызывает java.lang.ArrayIndexOutOfBoundsException и как его предотвратить?] (Http://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and- how-do-i-prevent-it) –

ответ

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; 
} 

Если вы хотите использовать Enum, вы можете проверить все Возможное значение ack_nak по if-else заявления.

Помните, вы не можете использовать непостоянное выражение в заявлении switch-case!

Edit:

Существует еще одно решение. Ваш метод 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; 
} 
+0

Итак, из того, что, я думаю, вы говорите, является то, что, поскольку байт -15, он выходит за пределы? несмотря на то, что он является законным значением, точно так же, как 51, CC и D8, которые все присутствуют в перечислении? –

+0

Да, это вне пределов. Массив не имеет отрицательных индексов. –

+0

Это единственный вариант, который я должен проверить мой байт и сохранить свое перечисление с его литьем? –

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 
} 

после этого foundEnum будет содержать соответствующее значение перечисления для байтов, которые вы ищете, и вы можете включить его.

+0

AH !! это делает, так как !, я думал, что случай с переключателем сделал в результате поиска для меня .. глупо меня .. узнал что-то новое !! –

Смежные вопросы