扫描程序异常:java.util.InputMismatchException

时间:2013-10-18 23:06:47

标签: java

我正在编写一个程序,接受来自文件的输入并打印城市列表及其降雨量。我在确定阵列所需长度和城市降雨量数据的扫描仪上遇到了麻烦。

我一直得到这个例外

  

线程“main”java.util.InputMismatchException中的异常       at java.util.Scanner.throwFor(Scanner.java:909)       在java.util.Scanner.next(Scanner.java:1530)       在java.util.Scanner.nextInt(Scanner.java:2160)       在java.util.Scanner.nextInt(Scanner.java:2119)       在BarChart.main(BarChart.java:29)

这是我的代码:

import java.util.Scanner;

public class BarChart
{
    public static void main (String[] args)
    {
        //create scanner
        Scanner scan = new Scanner(System.in);

        //create size variable
        int size = scan.nextInt();

        //create arrays to hold cities and values
        String[] cities = new String [size];
        int[] values = new int [size];

        //input must be correct
        if (size > 0)
        {
            //set values of cities
            for(int i=0; i<size; i++)
            {
                cities[i] = scan.nextLine();
            }

            //set values of the data
            for(int j=0; j<size; j++)
            {
                values[j] = scan.nextInt();
            }

            //call the method to print the data
            printChart(cities, values);
        }
        //if wrong input given, explain and quit
        else
        {
            explanation();
            System.exit(0);
        }
    }

    //explanation of use
    public static void explanation()
    {
        System.out.println("");
        System.out.println("Error:");
        System.out.println("Input must be given from a file.");
        System.out.println("Must contain a list of cities and rainfall data");
        System.out.println("There must be at least 1 city for the program to run");
        System.out.println("");
        System.out.println("Example: java BarChart < input.txt");
        System.out.println("");
    }

    //print arrays created from file
    public static void printChart(String[] cities, int[] values)
    {
        for(int i=0; i<cities.length; i++)
        {
            System.out.printf( "%15s %-15s %n", cities, values);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

在你的文件中,如果列表的大小是第一行的唯一内容,换句话说,如下所示:

2
London
Paris
1
2

然后当您输入for循环以读取城市名称时,扫描程序尚未读取第一个换行符。在上面的示例中,对newLine()的调用将读取一个空行和London,而不是LondonParis

因此,当您到达第二个for循环读取降雨数据时,扫描程序尚未读取上一个城市(上例中为Paris),并将抛出{{1因为城市名称显然不是有效的InputMismatchException

答案 1 :(得分:0)

this question类似,您还应该检查是否有另一个符合您所需模式的标记(int)。

在致电nextInt()之前,请先与scanner.hasNextInt()联系。

答案 2 :(得分:0)

根据错误消息以及发生错误的位置,您很可能尝试读取整数,但您正在读取的实际数据不是数字。

您可以通过将scan.nextInt()更改为scan.next()并打印出实际获得的值来验证这一点。或者,您可以添加表单的“错误处理”:

       for(int j=0; j<size; j++)
        {
          if (scan.hasNextInt()
            values[j] = scan.nextInt();
          else
            throw new RuntimeException("Unexpected token, wanted a number, but got: " + scan.next());
        }