我正在编写一个程序,接受来自文件的输入并打印城市列表及其降雨量。我在确定阵列所需长度和城市降雨量数据的扫描仪上遇到了麻烦。
我一直得到这个例外
线程“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);
}
}
}
答案 0 :(得分:2)
在你的文件中,如果列表的大小是第一行的唯一内容,换句话说,如下所示:
2
London
Paris
1
2
然后当您输入for循环以读取城市名称时,扫描程序尚未读取第一个换行符。在上面的示例中,对newLine()
的调用将读取一个空行和London
,而不是London
和Paris
。
因此,当您到达第二个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());
}