繁体   English   中英

用Java从多个txt文件中读取数据

[英]Reading Data from Multiple txt Files in Java

我是计算机科学入门的初学者,我正在使用 java。 尝试从 getLetterGrade 方法中的多个 txt 文件读取时,我在此程序中收到以下错误:

线程“main”中的异常 java.lang.IllegalStateException:扫描仪已关闭

import java.util.Scanner;
import java.io.*;

public class Exam
{
    private int grade;
    private float examAvg;
    private String name;
    private File exam1Data;
    private File exam2Data;
    private File namesData;
    private Scanner inFileExam1;
    private Scanner inFileExam2;
    private Scanner inFileName;

    //constructor
    public Exam() throws IOException
    {
        exam1Data = new File("exam1.txt");
        exam2Data = new File("exam2.txt");
        namesData = new File("names.txt");
        inFileExam1 = new Scanner(exam1Data);
        inFileExam2 = new Scanner(exam2Data);
        inFileName = new Scanner(namesData);
    }

public float getExam1Avg()
{
examAvg = 0;

while (inFileExam1.hasNext()) {
grade = inFileExam1.nextInt();
examAvg += grade;
}
inFileExam1.close();
examAvg = (float)(examAvg / 25.0);
return examAvg;
}

public float getExam2Avg()
{
examAvg = 0;

while (inFileExam2.hasNext()) {
grade = inFileExam2.nextInt();
examAvg += grade;
}
inFileExam2.close();
examAvg = (float)(examAvg / 25.0);
return examAvg;
}

    //method that finds the letter grade given a student name and
    //the exam number
    public char getLetterGrade(String inputName, int examNum)
    {
        char letter;
        int count = 1;

        //inputName = inputName.toLowerCase();

        do {
            if (inFileName.hasNext()){
                name = inFileName.nextLine();
            }
            count++;
        } while (inFileName.hasNext() && !name.equalsIgnoreCase(inputName));

        inFileName.close();

        if (!name.equalsIgnoreCase(inputName)) {
            return 'x';
        }

        if (examNum == 1) {
            for (int i = 1; i <= count && inFileExam1.hasNextInt(); i++) {
                grade = inFileExam1.nextInt();
            }
            inFileExam1.close();
        }
        else if (examNum == 2) {
            for (int i = 1; i <= count && inFileExam2.hasNextInt(); i++) {
                grade = inFileExam2.nextInt();
            }
            inFileExam2.close();
        }
        else {
            return 'x';
        }

        if (grade >= 90) {
            letter = 'A';
        }
        else if (grade < 90 && grade >= 80) {
            letter = 'B';
        }
        else if (grade < 80 && grade >= 70) {
            letter = 'C';
        }
        else if (grade < 70 && grade >= 60) {
            letter = 'D';
        }
        else {
            letter = 'F';
        }

        return letter;
    }
}

错误发生在以下行:

for (int i = 1; i <= count && inFileExam1.hasNextInt(); i++) {

请帮忙!!

这是主类:

import java.util.Scanner;
import java.io.*;

public class ExamAverages
{
public static void main(String[] args) throws IOException
{
Exam exam = new Exam();
System.out.println(exam.getExam1Avg());
System.out.println(exam.getExam2Avg());
System.out.println(exam.getLetterGrade("name", 1));
}

您正在关闭扫描仪

inFileName.close();

然后尝试在不打开的情况下再次使用它,如下所示:

inFileName = new Scanner(..); 

EDIT1它对我来说并没有失败,但也许我错过了一些东西(我仍然不知道你到底有多愿意阅读这些文件,它们是如何相互关联的)

public char getLetterGrade(String inputName, int examNum) {
    char letter;
    int count = 0;

    do {
        if (inFileName.hasNext()) {
            name = inFileName.nextLine();
        }
        count++;
    } while (inFileName.hasNext() && !name.equalsIgnoreCase(inputName));

    if (!name.equalsIgnoreCase(inputName)) {
        return 'x';
    }

    if (examNum == 1) {
        for (int i = 1; i <= count && inFileExam1.hasNextInt(); i++) {
            grade = inFileExam1.nextInt();
        }
        inFileExam1.close();
    } else if (examNum == 2) {
        for (int i = 1; i <= count && inFileExam2.hasNextInt(); i++) {
            grade = inFileExam2.nextInt();
        }
        inFileExam2.close();
    } else {
        return 'x';
    }

    if (grade >= 90) {
        letter = 'A';
    } else if (grade < 90 && grade >= 80) {
        letter = 'B';
    } else if (grade < 80 && grade >= 70) {
        letter = 'C';
    } else if (grade < 70 && grade >= 60) {
        letter = 'D';
    } else {
        letter = 'F';
    }

    return letter;
}

首先,每次阅读一行时,您都在重置grade ,而您并没有对它做任何事情,因此这部分代码是无用的。

但要回答你的问题:

根据 API, Scanner仅在使用Scanner.close()关闭对象或以某种方式被系统关闭后才返回IllegalStateException

尝试将inFileExam1Scanner声明移动到您使用它的inFileExam1旁边,如下所示:

if (examNum == 1) {
        inFileExam1 = new Scanner(exam1Data); // Add this
        for (int i = 1; i <= count && inFileExam1.hasNextInt(); i++) {
            grade = inFileExam1.nextInt();
        }
        inFileExam1.close();
    }
    else if (examNum == 2) {
        inFileExam2 = new Scanner(exam2Data); // And this
        for (int i = 1; i <= count && inFileExam2.hasNextInt(); i++) {
            grade = inFileExam2.nextInt();
        }
        inFileExam2.close();
    }
}

您没有包含具有您的主要方法的代码,但我将做出有根据的猜测,您在其中构建了一个新的Exam对象,并getLetterGrade调用getLetterGrade 由于您在构造函数中打开您的Scanners ,并在阅读后关闭它们,因此第二次调用getLetterGrade您将看到IllegalStateException

如果这个通灵读物不准确,您能否用main(String[] args)的内容更新您的帖子?

编辑:在您最近的编辑之后,我看到您在调用getLetterGrade之前调用了getExam1Avg方法。 由于getExam1Avg在您的Scanner上调用close ,因此您在调用其他方法时会收到 IllegalStateException。 您需要为每个方法调用实例化一个新的扫描器,或者在每个方法完成后重置扫描器。

您的错误在getAverageExam1Avg和另一个。 与其在getLetterGrade方法中关闭ScannergetLetterGrade让它们保持打开状态并添加一个像这样的close方法:

public void close() {
    inFileName.close();
    inFileExam1.close();
    inFileExam2.close();
}

确保将正确的异常添加到该代码中。

它现在失败的原因是你没有打开扫描仪。 取消注释构造函数中的实例。

如果这不起作用,我不知道会怎样。

暂无
暂无

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

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