我正在尝试阅读文本文件,但我一直在" java.util.InputMismatchException"。
主要课程:
dc.loadData(new File("DVDCollection.txt"));
读取/加载文件数据的类:
Scanner inputFile = null;
public void loadData(File fileName) {
try {
inputFile = new Scanner (new File("DVDCollection.txt"));
}
catch (Exception FileNotFoundException) {
System.out.println("ERROR: " + FileNotFoundException.getMessage());
System.exit(1);
}
while (inputFile.hasNext()) {
String fileTitle = inputFile.nextLine();
String fileCategory = inputFile.nextLine();
String fileRunningTime = inputFile.nextLine();
int fileYear = inputFile.nextInt();
double filePrice = inputFile.nextDouble();
DVD dvdEntry = new DVD(fileTitle, fileCategory, fileRunningTime, fileYear, filePrice);
DVDlist.add(dvdEntry);
}
inputFile.close();
}
文本文件每行有一条信息,没有换行符。
示例:
Movie title1 (Sttring)
movie category1 (String)
movie duration1 (String)
movie year1 (int)
movie price1 (double)
Movie title2
movie category2
movie duration2
movie year2
movie price2
etc
etc...
以下是它应该阅读的实际例子:
Adam
Documentary
78 minutes
2012
7.99
Choo Choo
Documentary
60 minutes
2006
11.99
错误说明了什么:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at XXXX_XXXX.DVDCollection.loadData(DVDCollection.java:29)
at XXXX_XXXX.DVDApplication.main(DVDApplication.java:14)
答案 0 :(得分:0)
这些行可能有问题:
int fileYear = inputFile.nextInt();
double filePrice = inputFile.nextDouble();
在某些时候找不到预期的类型(不是双倍)。 确保你转到下一行,并且你的文件没有错误(数字按预期格式化......)。
答案 1 :(得分:0)
InputMisMatchException
(从nextDouble()
抛出时)表示“下一个标记与Float正则表达式不匹配,或者超出范围”(引自Javadoc)。
所以问题最有可能发生在您尝试阅读的文件中。然而,如果没有它的内容,很难猜出究竟是什么罪魁祸首。
答案 2 :(得分:0)
Scanner#nextDouble()
抛出InputMismatchException
- 如果下一个标记与Float
正则表达式不匹配,或者超出范围。
很明显,输入不是浮点文字。我希望可能有空格,double
为string
..
答案 3 :(得分:0)
从跟踪显示,Scanner
已尝试读取应该为double
值的值不是double
值。
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
**at java.util.Scanner.nextDouble(Unknown Source)**
at XXXX_XXXX.DVDCollection.loadData(DVDCollection.java:29)
at XXXX_XXXX.DVDApplication.main(DVDApplication.java:14)
答案 4 :(得分:0)
在你的情况下,它适合
String fileTitle = inputFile.nextLine();
String fileCategory = inputFile.nextLine();
String fileRunningTime = inputFile.nextLine();
int fileYear = Integer.parseInt(inputFile.nextLine());
double filePrice = Double.parseDouble(inputFile.nextLine());
答案 5 :(得分:0)
我找到了你问题的原因。
当你使用nextline()时,它会使扫描程序超过当前行并将其放在下一行的开头。
但是当你使用nextInt或nextDouble时,扫描仪会超过nextInteger和下一个double值并放在当前行本身的末尾。
因此,\ n也会被读作下一个破坏序列的nextLine的一部分。
您可以像这样编写解决方法。
while (inputFile.hasNext()) {
String fileTitle = inputFile.nextLine();
String fileCategory = inputFile.nextLine();
String fileRunningTime = inputFile.nextLine();
int fileYear = Integer.parseInt(inputFile.nextLine());
double filePrice = Double.parseDouble(inputFile.nextLine());
}
inputFile.close();
答案 6 :(得分:0)
Just add the line marked with ***
while (inputFile.hasNext()) {
String fileTitle = inputFile.nextLine();
String fileCategory = inputFile.nextLine();
String fileRunningTime = inputFile.nextLine();
int fileYear = inputFile.nextInt();
double filePrice = inputFile.nextDouble();
DVD dvdEntry = new DVD(fileTitle, fileCategory, fileRunningTime,
fileYear, filePrice);
DVDlist.add(dvdEntry);
if (inputFile.hasNext()) //***
inputFile.nextLine();
}