2016-11-11 5 views
0

私はユーザーからいくつかのデータを読み込もうとしており、非常に簡単な計算をしていますが、説明できない何らかの理由で最初の2〜3入力後にプログラムが停止します。誰かがこの行動を説明できますか?このループを使用して無限に倍精度を読み取ることができないのはなぜですか?

マイコード:

Scanner in = new Scanner(System.in); 
System.out.println("Enter your values, 'q' to quit: "); 
double average, input, smallest, largest, range; 
average = smallest = largest = range = Double.parseDouble(in.nextLine()); 

int counter = 1; 

while (in.hasNextDouble()) { 
    input = Double.parseDouble(in.nextLine()); 
    smallest = input < smallest ? input: 0; 
    largest = input > largest ? input: 0; 
    average += input; 
    counter++; 
} 
+1

「プログラム停止」とはどういう意味ですか?それだけで終了するか、例外がありますか? – Fildor

+0

例外に直面している場合は、スタックトレースを提供して、ここでは「プログラムが停止しました」の正確な問題を理解してください。 –

+0

実行中のようです...どのような値を試しましたか? – jay

答えて

4

は、この入力を考えてみましょう:

1.23 
4.56 7.89 

Scannerするために、この2つの別々の行に3 double秒の有効なシーケンスのように見えます。 nextLineを呼び出すと、最初のdoubleが取得されますが、数字が文字列全体を占めているため、正常に動作します。

あなたは次のdoubleのために同じことを行うと、あなたはこのようになります解析しようとする文字列:あなたはそれを解析することはできませんので

"4.56 7.89" 

この文字列は、有効doubleではありません。

この問題を処理する1つの方法は、nextDoubleを呼び出して、完全に解析することを避けることです。 hasNextDouble()nextDouble()とのペアリングは、ユーザーが異なる行にデータを配置する必要がないという利点があります。

注:Double.parseDouble(in.nextLine())への最初の呼び出しは、プログラムが最初の不正な入力にクラッシュする可能性がありますのでScannerは、次のdoubleを持っていることを確認せずに起こる

+0

返信いただきありがとうございます。私はこれが問題だとは思わないが、間違っていることを証明するために上記のコメントを見てください! – Thomas

+0

@トーマス待って...あなたはそれを "考える"?だからあなたはそれを試していない? – Tom

+0

@Tom見て、私は "3.3 4.5 3.4"という形式の文字列で受け取っていません。私は各行に別々の倍精度の文字列を受け取っていますが、私はすでにこれを上記のコメントに書いています。 – Thomas

関連する問題