У меня супер странная проблема.
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 и в зависимости от журнала, который компилятор делает что-то еще?
Это не будет делать то, что вы ожидаете:
if (cmd == b)
Это сравнивает enum
с byte
→ getCmd()
всегда будет возвращать UNKNOWN
.
Строка регистрации не должна влиять на результат. Я предлагаю запустить код с отладчиком, чтобы убедиться, что он ведет себя так, как вы ожидаете.
Существует очень и очень маленький шанс, что вы нашли компилятор или ошибку VM. Попробуйте последнюю версию Java, чтобы это исключить.