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