Почему моя программа не вызывает мои методы?

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.

Есть смысл?

Другие вопросы по тегам