[英]Input mismatch when reading from a file
我有一個文件,其數據組織如下:
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.");
}
在消耗了你的int
和你的兩個double
s之后,你需要在讀取下一個車名之前使用line feed
。
因此,只需在carList.add(...)
之后添加scanFile.nextLine()
即可。
實際上,只是為了處理最后一行的情況, 假設在輸入文件中的最后一個double
數據之后沒有換行 ,你應該使用:
if(scanLine.hasNextLine()) {
scanLine.nextLine();
}
為了保護對scanLine.nextLine()
的調用,它會拋出NoSuchElementException
。
干杯!
nextLine()
定義為
使此掃描器前進超過當前行並返回跳過的輸入。 此方法返回當前行的其余部分,不包括末尾的任何行分隔符。 該位置設置為下一行的開頭。 由於此方法繼續搜索輸入以查找行分隔符,因此如果不存在行分隔符,則它可以緩沖搜索要跳過的行的所有輸入。
意味着nextLine()
將從當前位置讀取到行分隔符。
第一次調用double percentDiscount = scanFile.nextDouble();
,掃描儀的光標位於2005 16999 8
行2005 16999 8
。
在循環的第二次迭代中, String carName = scanFile.nextLine();
將讀取一個空字符串,因為8和行分隔符之間沒有字符串。 然后, int year = scanFile.nextInt();
當光標正在查看Mercury Mountaineer AWD
拋出一個InputMismatchException
。
我不知道我是否能夠很好地解釋自己。
要解決此問題,簡化版本只是在循環結束時添加額外的nextLine()
調用:
String carName = scanFile.nextLine();
int year = scanFile.nextInt();
double listPrice = scanFile.nextDouble();
double percentDiscount = scanFile.nextDouble();
scanFile.nextLine();
我想更好的處理方法是使用nextLine()
讀取每一行,並檢查該行是否為carname或year / price / discount info。
希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.