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”中的数据:
258
0001 200
0002 198
0003 430
0004 12
0005 30
0006 45
0007 154
0008 250
0009 120
0

现在,我使用 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

1

我已经为您的代码添加了一些调试。看看它向我们展示了什么:

...

num_marbles = in.nextInt();
System.out.println("num_marbles=" + num_marbles);
id = in.nextInt();
System.out.println("id=" + id);
while (id!=0) {
    answer = in.nextInt();
    System.out.println("answer=" + answer);

...

输出:

[C:\java_code\]java SuperMarbles
num_marbles=258
id=1
answer=200
answer=198
answer=3
answer=430
answer=4
answer=12
answer=5
answer=30
answer=6
answer=45
answer=7
answer=154
answer=8
answer=250
answer=120
answer=0
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at SuperMarbles.main(SuperMarbles.java:16)

你已经正确地获得了所有的输入,但是即使没有更多的输入,你也会继续尝试获得它。

您需要在in.hasNext()is时停止false。但是您根本没有对此进行测试。

另外,如果您将上次调试输出更改为

System.out.println("answer=" + answer + ", id=" + id);

您会发现idnever equals 0,因此您的 while 循环将永远不会结束。

可能还有其他问题,但这是两个很好的开始。祝你好运!

于 2014-02-23T16:45:32.413 回答
1

看起来您的某些代码可能位于错误的位置。您可以使用以下策略:

  1. 循环遍历所有答案,并设置获胜者的 id(最接近但不超过)
  2. 在循环之后,然后打印结果。(您的代码在循环内有进程获胜者
于 2014-02-23T16:46:46.317 回答
0

抛出 NoSuchElementException 是因为您试图读取数据末尾之后的内容。在读取下一个值之前,您应该在 Scanner 上调用 hasNext() 方法。在您的情况下,您似乎希望输入在“id”和“answer”之间交替,但您不同步,因为您并不总是在阅读下一个答案之前阅读下一个 id。

于 2014-02-23T16:49:04.800 回答