繁体   English   中英

为什么我看不到我的文本文件?

[英]Why can't I read my text file?

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

您可能对这些行有疑问:

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

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

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

因此,问题很可能出在您尝试读取的文件中。 但是,如果没有其内容,很难猜测出到底是什么原因。

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

因此很明显输入不是浮点文字。 我预计可能会有空间,这会使string double ..

从您的跟踪显示, 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)

在您的情况下,它将适合

String fileTitle = inputFile.nextLine();
String fileCategory = inputFile.nextLine();
String fileRunningTime = inputFile.nextLine();
int fileYear = Integer.parseInt(inputFile.nextLine());
double filePrice = Double.parseDouble(inputFile.nextLine());

我找到了您问题的原因。

当您使用nextline()时,它将使扫描仪前进到当前行的上方,并将其放置在下一行的开头。

但是,当您使用nextInt或nextDouble时,扫描仪将前进到nextInteger和next 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();
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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM