Почему моя программа не вызывает мои методы?
java методы statithing, но я не могу получить оператор while в строке 56 для правильного вызова моих методов. Есть ли что-то, что я делаю не так? Я очень новичок в Java, поэтому любая помощь будет оценена! Заранее спасибо! Вот мой код:
import java.util.*;
import javax.swing.*;
import java.io.*;
public class GradeCalculator {
static String fileInput;
static double totalGrade;
static int scoreCount= 0;
static double classAverage;
static double score;
static double testScore;
static double averageScore;
static int numberOfStudents = 0;
static char letterGrade;
static String fileOutput;
static String nameOfStudent;
static int numberCount;
static int numberCalculatedStudents;
static double average = 0;
public static void main (String[] args) throws FileNotFoundException {
//Welcome
JOptionPane.showMessageDialog(null,"Welcome to the Grade Calculator! This program will\n" +
" calculate the average percentage of 5 test scores that\n"+
" are given in a given file once these scores are\n"+
" averaged it will give the student a letter grade.","Welcome!",JOptionPane.PLAIN_MESSAGE);
fileInput = JOptionPane.showInputDialog(null, "Please enter the name of the input file you wish to use for this program."
,"Input File",JOptionPane.PLAIN_MESSAGE);
fileOutput = JOptionPane.showInputDialog(null, "Please enter the name of the output file you wish to use for this program."
,"Output File",JOptionPane.PLAIN_MESSAGE);
//preparing text files
PrintWriter outFile = new PrintWriter (fileOutput);
File inFile = new File (fileInput);
Scanner reader = new Scanner(new FileReader(fileInput));
outFile.println("Student Name Test1 Test2 Test3 Test4 Test5 Average Grade");
while(reader.hasNextLine()) {
nameOfStudent = reader.next();
outFile.printf("%n%n%s",nameOfStudent);
numberOfStudents++;
score = reader.nextDouble();
calculateAverage(score);
calculateGrade(averageScore);
outFile.printf(" %.2f ", averageScore);
outFile.println(" "+letterGrade);
}
classAverage = classAverage/numberCalculatedStudents;
outFile.print("\n\n\n\n\n\n\n\n\n\n\n\nClass average for "+ numberCalculatedStudents + "of" + numberOfStudents + "is" + classAverage);
JOptionPane.showMessageDialog(null,"The report has successfully been completed and written into the file of " + fileOutput +"."
+" The class average is " + classAverage + ". Please go to the output file for the complete report.");
outFile.close();
}
public static void calculateAverage(double score) throws FileNotFoundException {
Scanner reader = new Scanner(new FileReader(fileInput));
PrintWriter outFile = new PrintWriter (fileOutput);
while (reader.hasNextDouble() && numberCount <= 5 ) {
score = reader.nextDouble();
numberCount++;
if (score >= 0 & score <= 100) {
outFile.printf("%10.2f",score);
scoreCount++;
average = score + average;
}
else
outFile.printf(" **%.2f",score);
}
if (average!=0){
numberCalculatedStudents++;
average = average/scoreCount;
averageScore = average;
classAverage = average + classAverage;
}
average = 0;
}
public static char calculateGrade (double averageScore) {
if (averageScore >= 90 && averageScore <= 100)
letterGrade = 'A';
else if (averageScore < 90 && averageScore >= 80)
letterGrade = 'B';
else if (averageScore < 80 && averageScore >= 70)
letterGrade = 'C';
else if (averageScore < 70 && averageScore >= 60)
letterGrade = 'D';
else if (averageScore < 60 && averageScore >= 0)
letterGrade = 'F';
else
letterGrade =' ';
return letterGrade;
}
}
1 ответ
Не зная, по какой линии возникает проблема, у меня возникают две проблемы:
В верхней части цикла while:
if (score >= 0 & score <= 100)
{ outFile.printf("%10.2f",score);
scoreCount++;
average = score + average;
}
else
outFile.printf(" **%.2f",score);}
У вас есть закрывающая скобка (}
) после оператора else, но без открытой скобки. Так что закрывающая скобка выглядит как выход из цикла while до того, как вы этого захотите.
Во-вторых, похоже, что вы пытаетесь вернуть что-то (а именно символ) в своем методе CalculateGrade, но вы указали тип возврата void для него, что означает, что даже если у вас есть оператор return, ничего не возвращается, когда вы назови это. Вы не показываете, где вызываете этот метод, поэтому я не уверен, что это вызывает проблему, но это, безусловно, подозрительно. Кажется, вы хотите использовать:
public static char calculateAverage(double score) throws FileNotFoundException{
вместо public static void calculateAverage(double score)...
Кроме того, есть ли причина, почему все эти методы являются статическими? Вы знаете, что значит делать что-то статичное?
РЕДАКТИРОВАТЬ (на основе вашего комментария):
№ делает переменную static
делает его "переменной класса", что означает, что только один из них существует для всех объектов этого класса. Проиллюстрировать:
Если у вас есть такой класс:
class test {
static int id;
}
И вы запускаете следующий код:
test t1 = new test();
test t2 = new test();
t1.id = 4;
t2.id = 8;
System.out.println(t1.id);
это напечатает 8. Это потому, что, поскольку id является static
переменная, изменяющая его для любого объекта класса, приведет к его изменению для любого другого объекта класса.
Это в отличие от "переменной экземпляра", одна из которых существует для каждого объекта класса. Делать id
переменная экземпляра, просто удалите static
ключевое слово. Если вы сделаете это и запустите тот же код, он напечатает 4, потому что изменение переменной экземпляра t2 не влияет на t1.
Есть смысл?