从文件读取时输入不匹配

时间:2014-03-22 14:51:05

标签: java java.util.scanner inputmismatchexception

我有一个文件,其数据组织如下:

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.");
      }

2 个答案:

答案 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或年/价/折扣信息。

希望这有帮助。