我有一个非常奇怪的问题。
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时,它进入“未知”情况。但是如果我在进入交换机之前记录b,那么事情就可以了。有什么想法吗?
我想到的一件事:0x80是128并且有字节我不知道它在哪里以及如果与0xFF发生冲突并且根据日志编译器做了一件事或另一件事?
答案 0 :(得分:0)
这不符合你的期望:
if (cmd == b)
这会将enum
与byte
- >进行比较。 getCmd()
将始终返回UNKNOWN
。
记录行不应对结果产生任何影响。我建议使用调试器运行代码,以确保它的行为符合您的预期。
您发现编译器或VM错误的可能性非常小。尝试最新版本的Java只是为了排除这一点。