只有在Java中首先记录值时,某些字节比较才会起作用

只有在Java中首先记录值时,某些字节比较才会起作用,java,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;

我有一个非常奇怪的问题

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有冲突,编译器会根据日志做一件或另一件事?

这不会达到您的预期:

if (cmd == b)
这将比较
枚举
字节
->
getCmd()
将始终返回
未知

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


您发现编译器或VM错误的可能性非常非常小。请尝试最新版本的Java以排除这种可能性。

这是哪一版本的Java?如果您能重现这一点,我会感到惊讶。请尝试提供一个简短但完整的程序来演示问题。如果(cmd==b)正在比较a
MyCmd
和a
byte
,就我所知,该代码甚至不应该编译。。。你甚至还没有提供一个
MyCmd(byte)
构造函数。@JonSkeet正如你所说,我很不舒服,因为我不能非常具体地重现这个问题。“我在这里要求你有这方面的经验。@托马斯:你可以从编译代码开始。但我怀疑基本上你运行的是一个坏版本的代码,碰巧登录了,然后在删除日志的同时修复了一个bug。除非我们有证据证明情况并非如此,否则很难帮助您。@Thomas您展示的代码远不是可编译的-缺少
case
语句,是假的
其中应该有
等等。使用
System.err.println
替换记录器输出时会发生什么情况?。另外,当您将
0x80
传递给
f
时,您说它记录
-127
,但
0x80
-128
我告诉您我的代码没有编译,它或多或少是伪代码。但问题是真的。更糟糕的是:我删除了日志记录,程序运行正常,5分钟后事情开始不正常工作。我不知道会出什么问题的是,唯一有问题的应用程序?你在机器上运行了内存测试吗?您是否尝试过更新版本的Java?