1

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

我不断收到此异常

在 java.util.Scanner.next(Scanner.java:1530) 在 java.util.Scanner.throwFor(Scanner.java:909) 在 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);
        }
    }
}
4

3 回答 3

2

在您的文件中,如果列表的大小是第一行的唯一内容,换句话说,就像这样:

2
London
Paris
1
2

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

因此,当您进入第二个 for 循环以读取降雨数据时,扫描仪尚未读取最后一个城市(Paris在上面的示例中),并且将抛出 ,InputMismatchException因为城市名称显然不是有效的int

于 2013-10-18T23:15:39.237 回答
0

就像在这个问题中一样,您还应该检查是否有另一个令牌与您想要的模式(int)相匹配。

在调用之前检查scanner.hasNextInt()nextInt()

于 2013-10-18T23:16:59.780 回答
0

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

您可以通过将您更改scan.nextInt()为 ascan.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());
        }
于 2013-10-18T23:17:38.877 回答