只有当我在Java中首先记录值时,一些字节比较才有效



我有一个超级奇怪的问题。

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)

比较enumbyte -> getCmd()总是返回UNKNOWN

日志行不应该对结果有任何影响。我建议使用调试器来运行代码,以确保它的行为符合您的期望。

有一个非常,非常小的机会,你发现一个编译器或VM错误。请尝试最新版本的Java以排除这种情况。

相关内容

最新更新