1

瓶の中のビー玉の数に最も近い人物の ID 番号を表示するプログラムを作成しました。これはプログラムです:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class SuperMarbles
{
  public static void main(String[] args) throws IOException
  {
    int guess = 0;
    int contestants = 0;
    int num_marbles, answer, id, winner = 0;

    Scanner scanner = new Scanner(new FileReader("promo.txt"));
    PrintWriter printWriter = new PrintWriter(new FileWriter("winner.txt"));

    num_marbles = scanner.nextInt();
    id = scanner.nextInt();
    while (id != 0)
    {
      answer = scanner.nextInt();
      if (answer > guess && answer <= num_marbles)
      {
        guess = answer;
        winner = id;
        id = scanner.nextInt();
        contestants++;
      }
    }

    if (guess == 0)
    {
      printWriter.printf("There are %d contestants", contestants);
      printWriter.printf("\nThere are no winners");
    }
    else
    {
      printWriter.printf("There are %d contestants", contestants);
      printWriter.printf("\nThe winner is ID#%d", winner);
    }
    scanner.close();
    printWriter.close();

  }

}

入力 ファイル「promo.txt
」 の データ は 次

とおり
です 。






今、私はJCreatorを使用しています。コンパイルしようとすると、「ビルド出力」の下にエラーが表示されず、「プロセスが完了しました」が表示されますが、「一般出力」の下には次のように表示されます。

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at SuperMarbles.main(SuperMarbles.java:25)

Process completed.

また、出力ファイル「winner.txt」は作成されていません。Javaに関してはかなりの初心者ですが、どんな助けでも大歓迎です。

4

3 に答える 3

0

データの末尾を超えて読み取ろうとしているため、NoSuchElementException がスローされます。次の値を読み取る前に、Scanner で hasNext() メソッドを呼び出す必要があります。あなたの場合、入力が「id」と「answer」を交互に繰り返すことを期待しているように見えますが、次の回答を読む前に常に次の id を読むとは限らないため、同期が取れていません。

于 2014-02-23T16:49:04.800 に答える