0

我正在尝试读取文本文件,但我不断收到“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)
4

7 回答 7

0

您可能对这些行有疑问:

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

在某些时候找不到预期的类型(不是双精度型)。确保您转到下一行并且您的文件不包含任何错误(数字按预期格式化......)。

于 2013-04-04T09:52:23.310 回答
0

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

因此,问题很可能出在您尝试读取的文件中。然而,没有它的内容,很难猜出罪魁祸首究竟是什么。

于 2013-04-04T09:54:03.367 回答
0

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

很明显,输入不是浮点文字。我期待可能有空间,这double使得string..

于 2013-04-04T09:54:14.107 回答
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)
于 2013-04-04T09:58:08.717 回答
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());
于 2013-04-04T09:59:50.147 回答
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();
于 2013-04-04T10:05:34.640 回答
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();
}
于 2013-04-04T10:25:16.717 回答