Некоторое сравнение байтов работает, только если я сначала регистрирую значения в Java

1

У меня супер странная проблема.

public enum MyCmd {
  CMD_UP((byte) 0x80),
  CMD_DOWN((byte) 0x81);
  UNKNOWN((byte) 0xFF);

  public static MyCmd getCmd(byte b) {
    for (MyCmd cmd : MyCmd.values()) {
      if (cmd == b)
        return cmd;
    }
    return UNKNOWN;
  }
}

void f(byte b) {
    _logger.debug("in:" + b);  // remove or not ?
    MyCmd cmd = MyCmd.getCmd(b);
    switch (cmd) {
        CMD_UP: _logger.debug("up"); break;
        CMD_DOWN: _logger.debug("down"); break;
        default:  _logger.debug("unknown"); break;
    }
}


// with log
f((byte)(0x80))
  in: -127
  up

// without log
f((byte)(0x80))
  unknown

Когда f вызывается с b = -127, он переходит в "неизвестный" случай. Но если я запишу b до входа в коммутатор, тогда все будет в порядке. Есть идеи?

Одна вещь, о которой я думал: 0x80 - 128, а с байтами я не знаю, куда она идет, и если есть конфликт с 0xFF и в зависимости от журнала, который компилятор делает что-то еще?

Теги:

1 ответ

0

Это не будет делать то, что вы ожидаете:

if (cmd == b)

Это сравнивает enum с bytegetCmd() всегда будет возвращать UNKNOWN.

Строка регистрации не должна влиять на результат. Я предлагаю запустить код с отладчиком, чтобы убедиться, что он ведет себя так, как вы ожидаете.

Существует очень и очень маленький шанс, что вы нашли компилятор или ошибку VM. Попробуйте последнюю версию Java, чтобы это исключить.

  • 0
    Я сообщаю вам, что мой код не компилируется, это был более или менее псевдокод. Но проблема реальна. Еще хуже: я снял логи, программа работает, найди, и через 5 минут все начинает работать не нормально. Я понятия не имею, что может пойти не так
  • 1
    Это единственное приложение, которое имеет проблемы? Вы запустили тест памяти на машине? Вы пробовали использовать более свежую версию Java?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню