0

请在下面的代码片段中解释编译器行为。考虑文本文件包含以下文本 TOBE 并且相应的字节值是 84、79、66、69

for(int i=0;i<4;i++){
    byte inByte=(byte) buffInputFile.read();
    system.out.println(inByte);
}

当我运行此代码段时,我得到以下输出 84 79 66 69

但是当我在 for 循环中调试并进入时。buffInputFile.read() 起初显示为 84,分配给 inByte 时为 79。我得到的输出是

79,66,69,13(13是回车)。

4

2 回答 2

3

我怀疑你有一个调试器监视表达式buffInputFile.read()- 它正在从流中读取值以显示它......但是当方法作为代码的一部分执行时,该值不可用。你已经从流中读取了那个字节,所以下一次调用read()将读取下一个字节,就像它应该做的那样。

一般来说,像这样在调试器中执行带有副作用的方法是一个非常糟糕的主意——它会导致这种混乱。如果您只是在赋值后的行上设置一个断点,您可以通过这种方式查看值。

简而言之:这根本不是编译器行为出错 - 这是您使用调试器的方式。

于 2011-06-07T06:52:53.927 回答
1

这不是一个错误,这是一个功能。该read方法从流中返回下一个字节,并将内部标记设置为下一个位置。

当您buffInputFile.read()使用调试器进行检查时,您可以有效地调用该方法,并且调试器会显示实际值。但是标记已设置到下一个位置,因此inByte将从流中接收下一个值。

于 2011-06-07T06:53:15.873 回答