[英]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
。
尝试将inFileExam1
的Scanner
声明移动到您使用它的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
方法中关闭Scanner
, getLetterGrade
让它们保持打开状态并添加一个像这样的close
方法:
public void close() {
inFileName.close();
inFileExam1.close();
inFileExam2.close();
}
确保将正确的异常添加到该代码中。
它现在失败的原因是你没有打开扫描仪。 取消注释构造函数中的实例。
如果这不起作用,我不知道会怎样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.