我有一个文件,其数据组织如下:
Hyundai Santa Fe
2005 16999 8
Mercury Mountaineer AWD
2004 17999 7.5
Mercury Grand Marquis
2006 19999 12.5
第一行是汽车名称,下一行是年份,价格和折扣金额。我正在尝试阅读包含许多这些行的文件,并且起价是价格和折扣并不总是表示为双倍。
这是我编写的代码片段,但没有正确解析这些代码。我得到输入不匹配异常。
我做错了什么?
try {
Scanner scanFile = new Scanner(file);
while(scanFile.hasNext()) {
String carName = scanFile.nextLine();
int year = scanFile.nextInt();
double listPrice = scanFile.nextDouble();
double percentDiscount = scanFile.nextDouble();
double discountAmount = calculateDiscount(listPrice, percentDiscount);
double netPrice = calculateNetPrice(listPrice, discountAmount);
carList.add(new Proj1CarData(carName, year, listPrice, percentDiscount, discountAmount, netPrice));
}
} catch(FileNotFoundException fnfe) {
System.out.println("Unable to locate the file supplied.");
}
答案 0 :(得分:1)
在使用了int
和两个double
后,您需要使用line feed
才能阅读下一个车名。
因此,只需在scanFile.nextLine()
之后立即添加carList.add(...)
即可。
实际上,只是为了处理最后一行的情况,假设在输入文件中的最后double
数据之后没有换行,你应该使用:
if(scanLine.hasNextLine()) {
scanLine.nextLine();
}
以保护对scanLine.nextLine()
的{{1}}号召唤。
干杯!
答案 1 :(得分:1)
nextLine()
定义为
使此扫描程序超过当前行并返回该输入 被跳过了。此方法返回当前行的其余部分, 排除末尾的任何行分隔符。该职位设定为 下一行的开头。由于此方法继续搜索 通过输入寻找行分隔符,它可以缓冲所有 如果没有行分隔符,则搜索要跳过的行的输入 本。
表示nextLine()
将从当前位置读取到行分隔符。
第一次拨打double percentDiscount = scanFile.nextDouble();
后,扫描仪的光标位于第2005 16999 8
行后8位。
在循环的第二次迭代中,String carName = scanFile.nextLine();
将读取一个空字符串,因为8和行分隔符之间没有字符串。然后,当int year = scanFile.nextInt();
光标正在查看InputMismatchException
时,Mercury Mountaineer AWD
会抛出nextLine()
。
我不知道自己是否能够很好地解释自己。
要解决此问题,简化版本只是在循环结束时添加额外的
String carName = scanFile.nextLine();
int year = scanFile.nextInt();
double listPrice = scanFile.nextDouble();
double percentDiscount = scanFile.nextDouble();
scanFile.nextLine();
调用:
nextLine()
我认为更好的处理方法是使用{{1}}读取每一行,并检查该行是否为carname或年/价/折扣信息。
希望这有帮助。