2016-04-01 4 views
7

同じコードに対して2つの異なる出力が得られます。デバッグしてすべての行を実行すると(Netbeans 8.1を使用して)1つの結果が得られます。コードを一度に実行すると、私は別の結果になります。readline()を使用すると 'run'と 'debug'の出力が異なります

これは、このコードは、両方の場合において、最初の行firstを印刷する必要があり、入力ファイル

first 
second 
third 
fourth 

ある、

public class Testing { 
    public static void main(String... args) throws IOException { 
     BufferedReader file = new BufferedReader(new FileReader("input")); 
     String str = file.readLine(); 
     System.out.println(str); 
    } 
} 

コードです。しかし、それはコードを実行するときだけです。

コードをデバッグしてすべての行をステップ実行すると、2行目のsecondが出力されます。

どうしてですか?

更新: 次はデバッグのスクリーンショットです。今すぐ、ステップオーバーすると、System.out.println行が実行されます。右側に見られるように、strには「second」が含まれています。

enter image description here

+0

これは毎回発生しますか?または断続的に? – Kon

+0

@Kon毎回発生します。 –

+0

コードをデバッグするのにどのユーティリティを使用していますか? – snickers10m

答えて

11

デバッグしている間、あなたのIDEは、file.readLine()を評価していますか? Eclipseでは、これを正確に行う「ウォッチ式」を定義できます。

これは、行ごとにコードをステップ実行したときに、fileが定義されているため、上記の式を評価できる行が1つしかないため、問題が説明される可能性があります。したがって、firstの代わりにsecondの出力。

更新:これでスクリーンショットを追加したので、わかりました。変数を評価することは副作用がなく、任意の式(例えばfile.readLine()のようなもの)を評価することは明らかに間違っているので、見出しに「変数」を選択したので、NetBeans開発者の責任の一部です。

+1

あなたの推測が正しいなら、それは確かに優れた推測です。 – Kon

+0

私はそれを複製することができます!単に 'file.readLine()'で停止し、ウォッチャーを有効にすると、sysoutは2行目を表示します。それは私にとって初めてのことです – dambros

+2

恐らくこれは、そのスクリーンショットのウォッチリストに実際に表示されている式file.readLine()を評価することによって、副作用を引き起こすデバッガの1つのケースです。ローランドはそうです、根本的な原因になるはずです。 –

関連する問題