我有一个超级奇怪的问题。
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
当用b=-127调用f时,它转到"unknown"情况。但如果我在进入开关前对b进行log,就没问题了。你知道吗?
我在想的一件事:0x80是128字节,我不知道它去哪里,如果与0xFF有冲突,取决于编译器的日志做一件事或另一件事?
这不是你想要的:
if (cmd == b)
比较enum
和byte
-> getCmd()
总是返回UNKNOWN
。
日志行不应该对结果有任何影响。我建议使用调试器来运行代码,以确保它的行为符合您的期望。
有一个非常,非常小的机会,你发现一个编译器或VM错误。请尝试最新版本的Java以排除这种情况。