线程" main"中的错误异常java.util.InputMismatchException

时间:2014-11-29 21:31:13

标签: java debugging

我试图创建一个读取文件的应用程序并写入数字的总和,平均值,文件中的数字数,但是我收到错误

Exception in thread "main" java.util.InputMismatchException
t java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextDouble(Scanner.java:2413)
    at TestGradesAnalysis.main(TestGradesAnalysis.java:30)
Java Result: 1

你能帮我解决这个错误吗?

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

public class TestGradesAnalysis {

     public static void main(String args[]) throws IOException {


        PrintWriter outFile = new PrintWriter(new FileWriter("File.dat"));
        double sum = 0;
        int count = 0;
        double max = 0;
        double min = 0;

        while (in.hasNextDouble()) {
            sum = sum + in.nextInt();
            count++;
            if (in.nextDouble() > max) {
                max = in.nextDouble();

            }
            if (min > in.nextDouble()) {
                min = in.nextDouble();
            }
        }

        double average = sum / count;

        outFile.println("average is" + average);
        outFile.println("max is" + max);
        outFile.println("min is " + min);
        outFile.println("number of grades is" + count);

    }

这是我的代码

这些是File.dat

的内容

28 28 28 2008 510 2116年9月89日

2 个答案:

答案 0 :(得分:1)

while循环中,您多次调用nextDouble()。这意味着,即使hasNextDouble()为真,也可以在一次迭代中前进几个字段,可能会尝试在某个时刻将September字符串解析为double。

解决方案是在每次迭代中读取一次值并将其存储在变量中。

while (in.hasNextDouble()) {
    double current = in.nextDouble();
    sum = sum + current;
    count++;

   if (current > max) {
       max = current;
   }
   if (min > current) {
       min = current;
   }
}

答案 1 :(得分:0)

出现了一些问题,但我们首先关注的是有关报告失败的原始问题。

滥用Scanner.next()

Scanner.next*()方法检查下一个标记。这意味着当您在while循环中多次调用它们时,您将比您可能想要的更快地推进列表。我们可以通过在循环开始时调用它并保持值来解决这个问题。

在"四月"

停止

我不完全确定你的要求所以我甚至不确定这是否需要修复或预期会有什么行为,但请记住,输入文件中的数字读数将停在"四月&#34 ;.这是因为它检查是否有任何双打(浮点数)。这对于单词/字符串来说是错误的(例如" April")。如果您愿意,可以通过检查泛型hasNext()和next()一段时间来使代码前进。

输出文件中缺少输出

您可能会或可能不会错过任何输出。该文件将被创建得相当快,但写作可能不会发生。这是由编程器在刷新流之前完成的。您应该在执行println调用后调用PrintWriter.flush()以通知系统它应该刷新流。

来自documentation for OutputStream.flush()

  

flush的一般契约是调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地。

输出文件可能不在正确的目录

当您使用文件名创建FileWriter时,我不完全确定您是否要在当前工作目录中创建它。我认为这是无意的,在这种情况下,提供的文件名应该是dir + "/myDataFile.dat"

最小/最大输出值错误

初始化这些值时,您应将max设置为Double.MIN_VALUE,将min设置为Double.MAX_VALUE。您将在示例中看到未正确设置的最小值 - 这是由最小值始终为0引起的。如果你的所有值都是负数(低于0),你会看到当前代码没有正确设置最大值。