2016-06-13 8 views
1

標準入力から入力を読み取ります。私の入力データは複数の行を持ち、最初の行はレコードの総数を持ち、2行目からレコードが始まります。すべての行がレコードです。私たちはn + 1行を持つでしょう。だから私はnextInt()の最初の行の番号を読んでみたい。ここに私のコードです:デバッグモードでは、デバッグモードでステップ実行するたびに、Javaスキャナは次の区切り文字まで読み取ります

Scanner scanner = new Scanner(System.in); 
//read number of lines for scanner to break loop 
int numRecords = 0; 
if (scanner.hasNextInt()){ 
    numRecords = scanner.nextInt(); 
    ... 
} 

しかし、私はF6キーを押すたびに、私はscanner.next()変更を参照してください。私は、入力として、テストデータの次の行を持っている場合:

3 
1,1,[email protected],123 Sesame St.,New York,NY,10011,12345689010 
2,1,[email protected],123 Sesame St.,New York,NY,10011,10987654321 
3,2,[email protected],123 Sesame St.,New York,NY,10011,12345689010 

私は自分のコードの行3に到達すると、

int numRecords = 0; 

scanner.next()3です。しかし、それはライン4に到達したとき、

if (scanner.hasNextInt()){ 

それは1,1,[email protected],123なのでscanner.next()3ではないのでif条件はtrueになることはありません。次回F6を押すと、Sesameに変わります。

これは予期した動作ではありません。どうして?

+0

わからない:理想的には、簡単にデータを毎回再入力することなく検証できる機能parseRecord(String)を、デバッグしたいと思います。私が正しく理解していれば、デバッガでscanner.next()を評価すると、スキャナが次のトークンに移動したことに驚いています。それは正常であり、期待通りです:それは、scanner.next()がするはずのものです。デバッグ中に副作用がある式を評価するのは良い考えではありません。 –

+0

'scanner.hasNextInt()'のようなものを条件として置くと、 'Scanner'を使うときにデバッグできません。しかし、私は 'scanner.nextInt()'を呼び出すのではなく、ただ評価しています。私は 'if'を' while 'に変更し、役に立たなかった。これは、 'Scanner'、最初の' hasNextXXX() '、' nextXXX() 'の使用時にどのようにコードするべきでしょうか? – FaithReaper

+1

scanner.next()を評価すると、それを呼び出して結果を表示することになります。 scanner.next()の結果を変数に格納し、その変数を必要な回数だけ評価します。それは副作用がありません。 –

答えて

2

Scanner#nextside-effectsの方法です。これは、その実行が環境内で何か変わることを意味します。しかし、デバッガーは、pureメソッドと副作用を持つメソッドを区別しません。したがって、時計リストに追加するとすぐに、式scanner.next()デバッガのデバッガはすべてのデバッグステップで評価し、入力を進めていくので、それはあなたが観察しているものです。

scanner.next()を見ながら、あなたの現在のコードをデバッグする方法はありませんので、あなたがする必要があります

  • 変更方法は、コードをデバッグしている - 見表現からscanner.next()を削除します。
  • これをデバッグできるようにコードを変更します。中間解析された入力が格納される変数を追加します。

入力の形式を考慮して、入力をtokenizeにする関数を作成して、各トークンが他の関数でどのように処理されるかをデバッグすることができます。私は理解して

public static void main(String args[]) { 
     parseRecord("1,1,[email protected],123 Sesame St.,New York,NY,10011,12345689010"); 
} 
+0

あなたは本当に何か教えてくれました。ありがとう。 – FaithReaper

関連する問題