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ループでdubugを実行して、中に入ると。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 に答える