为什么我不能读取我的文本文件?

时间:2013-04-04 09:45:23

标签: java

我正在尝试阅读文本文件,但我一直在" 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)

7 个答案:

答案 0 :(得分:0)

这些行可能有问题:

int fileYear = inputFile.nextInt();
double filePrice = inputFile.nextDouble();

在某些时候找不到预期的类型(不是双倍)。 确保你转到下一行,并且你的文件没有错误(数字按预期格式化......)。

答案 1 :(得分:0)

InputMisMatchException(从nextDouble()抛出时)表示“下一个标记与Float正则表达式不匹配,或者超出范围”(引自Javadoc)。

所以问题最有可能发生在您尝试阅读的文件中。然而,如果没有它的内容,很难猜出究竟是什么罪魁祸首。

答案 2 :(得分:0)

Scanner#nextDouble()抛出InputMismatchException - 如果下一个标记与Float正则表达式不匹配,或者超出范围。

很明显,输入不是浮点文字。我希望可能有空格,doublestring ..

答案 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();
}