0

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

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

2 回答 2

1

消费完你的int和你的两辆后double,需要先消费后line feed才能读取下一个车名。

因此,只需scanFile.nextLine()在您carList.add(...)应该做的伎俩之后立即添加。

实际上,只是为了处理最后一行的情况,假设在输入文件中的最后一个数据之后没有换行double,您应该使用:

if(scanLine.hasNextLine()) {
    scanLine.nextLine();
}

为了保护调用scanLine.nextLine()那会抛出一个NoSuchElementException.

干杯!

于 2014-03-22T15:09:43.850 回答
1

nextLine()定义为

将此扫描器前进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可能会缓冲所有搜索要跳过的行的输入。

这意味着nextLine()将从当前位置读取到行分隔符。

在第一次调用 之后double percentDiscount = scanFile.nextDouble();,扫描仪的光标位于 8 in line 之后2005 16999 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()并检查该行是否是汽车名称或年份/价格/折扣信息。

希望这有帮助。

于 2014-03-22T15:12:01.150 回答