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

时间:2014-03-13 13:22:49

标签: 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时,它进入“未知”情况。但是如果我在进入交换机之前记录b,那么事情就可以了。有什么想法吗?

我想到的一件事:0x80是128并且有字节我不知道它在哪里以及如果与0xFF发生冲突并且根据日志编译器做了一件事或另一件事?

1 个答案:

答案 0 :(得分:0)

这不符合你的期望:

if (cmd == b)

这会将enumbyte - >进行比较。 getCmd()将始终返回UNKNOWN

记录行不应对结果产生任何影响。我建议使用调试器运行代码,以确保它的行为符合您的预期。

您发现编译器或VM错误的可能性非常小。尝试最新版本的Java只是为了排除这一点。