0

エラー: 非静的メソッドは静的コンテキストから参照できません。

私の場合、メソッドは readFile() と呼ばれます。

やあ。無数の初心者プログラマーが以前に経験したのと同じエラーを経験していますが、それについて何時間も読んだにもかかわらず、その知識を自分の状況に適用する方法がわかりません。

コードを再構築する必要があるかもしれないと思うので、クラスの全文を含めます。

main() メソッドを小さな Main クラスに格納したいのですが、簡単にするためにここでは同じクラスに配置しました。どこに置いても同じエラーが発生します。

readFile() メソッドは main() メソッド内に簡単に配置できますが、このような小さなモジュラー メソッドを作成して main() メソッドから呼び出す方法を学びたいと思います。もともと closeFile() も別のメソッドでした。

プログラムは次のことを想定しています。

  1. .dat ファイルを開く
  2. 検査結果に関するデータをファイルから読み込む
  3. 情報に対して計算を実行する
  4. 計算結果を出力する

ファイルの各行は、個々の学生に関する情報です。
シングルは 3 つの試験問題で構成されます。
ほとんどの計算は個々の生徒に関するものです。
しかし、一部の計算では、生徒のコレクション全体 (つまり、クラス) が考慮されます。

注:コード内で「クラス」という言葉が使用されている場合、OO プログラミングの意味でのクラスではなく、学生のアカデミック クラスを指します。

問題を解決するためにさまざまな方法を試しました。

現在のアプローチは、単一の学生試験に関するデータをクラス「試験」のインスタンスに格納することです。
これは、入力ファイルの 1 行と、そのインスタンスのみの他の属性に関する後続の計算に対応します。

これらの属性には、readFile() の while ループ中に値が入力されます。
while ループが終了すると、Exam のコレクション全体 (つまり、アカデミック クラス全体) に関係する 3 つの計算が呼び出されます。

2 つ目の質問は次のとおりです。
「Declare Attributes」というコメントの下で、クラスの属性を 2 つのサブグループに分けました
。クラス変数として (キーワード static を使用して) 定義する必要があると思われるものです。
私が思うものは、インスタンス変数として定義する必要があります。
最初のグループにキーワード static を追加する必要があるかどうかを教えてください。

関連する質問は次のとおりです。
インスタンスのコレクション全体を使用して計算を実行するメソッドも、静的/クラス メソッドとして宣言する必要がありますか?
私がそれを試みたとき、これらがインスタンスメソッドを呼び出そうとしたときに同様のエラーが発生しました。

ありがとう。

PS: このフォーラムについて:
コードをコード ブロックで囲みましたが、Java 構文は強調表示されていません。
投稿したら変わるかもしれません。しかし、そうでない場合は、誰かが方法を教えてくれれば喜んで再フォーマットします。

PPS: これは宿題です。
以下のすべてのコードを自分で作成しました。
「宿題」タグは廃止されたので使用しませんでした。


入力ファイル名: "results.dat"
入力ファイルのパス: "C:/Users/ADMIN/Desktop/A1P3E1 Files/results.dat"
入力ファイルの内容 (ランダムに生成されたデータ):

573,Kalia,Lindsay,2,8,10
966,Cheryl,Sellers,8,5,3
714,Shea,Wells,7,6,2
206,April,Mullins,8,2,1
240,Buffy,Padilla,3,5,2
709,Yoko,Noel,3,2,5
151,Armand,Morgan,10,9,2
199,Kristen,Workman,2,3,6
321,Iona,Maynard,10,2,8
031,Christen,Short,7,5,3
863,Cameron,Decker,6,4,4
986,Kieran,Harvey,7,6,3
768,Oliver,Rowland,8,9,1
273,Clare,Jacobs,9,2,7
556,Chaim,Sparks,4,9,4
651,Paloma,Hurley,9,3,9
212,Desiree,Hendrix,7,9,10
850,McKenzie,Neal,7,5,6
681,Myra,Ramirez,2,6,10
815,Basil,Bright,7,5,10

Java ファイル名: "Exam.java"
Java パッケージ名: "a1p3e1"
Java プロジェクト名: "A1P3E1"
Java ファイルの内容:

/** TODO
 *  [+] Error Block - Add Finally statement
 *  [?] studentNumber - change data type to integer (or keep as string)
 *  [?] Change Scope of to Non-Instance Variables to Static (eg classExamGradeSum)
 *  [*] Solve "non-static method cannot be referenced from a static context" error
 *
 */

package a1p3e1; // Assignment 1 - Part 3 - Exercise 1

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

/**
 *
 * @author                                                                           
 */

public class Exam {

//  (1) Declare Attributes
//  (-) Class Attributes
    protected Scanner fileIn;
    protected Scanner lineIn;
    private String line;
    private String [] splitLine;

    private String InFilePath = "C:/Users/ADMIN/Desktop/A1P3E1 Files/results.dat";
    private int fileInRowCount = 20;
    private int fileInColumnCount = 6;
    private int fileOutRowCount = 20;
    private int fileOutColumnCount = 14;

//    private int classExamGradeSum = 0;                                             
    private int classExamGradeSum;
    private double classExamGradeAverage = 0.0;
    private int [] classExamGradeFrequency = new int [10];                           

    protected Exam exam []  = new Exam [fileInRowCount];                             


//  (-) Instance Attributes
    private String studentNumber;                                                    
    private String forename;
    private String surname;
    private int paper1Grade;
    private int paper2Grade;
    private int paper3Grade;

    private String paper1Outcome;
    private String paper2Outcome;
    private String paper3Outcome;

    private int fileInRowID;
    private int failCount;
    private int gradeAverageRounded;
    private int gradeAverageQualified;
    private String examOutcome;


//  (3) toString Method Overridden
    @Override
    public String toString () {
        return    "\n Student Number:       " + studentNumber
                + "\n Forename:             " + forename
                + "\n Surname:              " + surname
                + "\n Paper 1 Grade:        " + paper1Grade
                + "\n Paper 2 Grade:        " + paper2Grade
                + "\n Paper 3 Grade:        " + paper3Grade
                + "\n Paper 1 Outcome:      " + paper1Outcome
                + "\n Paper 2 Outcome:      " + paper2Outcome
                + "\n Paper 3 Outcome:      " + paper3Outcome
                + "\n File In Row ID:       " + fileInRowID
                + "\n Fail Count:           " + failCount
                + "\n Exam Grade Rounded:   " + gradeAverageRounded
                + "\n Exam Grade Qualified: " + gradeAverageQualified
                + "\n Exam Outcome:         " + examOutcome;
    }


//  (4) Accessor Methods
    public String getStudentNumber () {
        return studentNumber;
    }

    public String getForename () {
        return forename;
    }

    public String getSurname () {
        return surname;
    }

    public int getPaper1Grade () {
        return paper1Grade;
    }

    public int getPaper2Grade () {
        return paper2Grade;
    }

    public int getPaper3Grade () {
        return paper3Grade;
    }

    public String getPaper1Outcome () {
        return paper1Outcome;
    }

    public String getPaper2Outcome () {
        return paper2Outcome;
    }

    public String getPaper3Outcome () {
        return paper3Outcome;
    }

    public int getFileInRowID () {
        return fileInRowID;
    }

    public int getFailCount () {
        return failCount;
    }

    public int getGradeAverageRounded () {
        return gradeAverageRounded;
    }

    public int getGradeAverageQualified () {
        return gradeAverageQualified;
    }

    public String getExamOutcome () {
        return examOutcome;
    }


//  (5) Mutator Methods

    public void setStudentNumber (String studentNumber) {
        this.studentNumber = studentNumber;
    }

    public void setForename (String forename) {
        this.forename = forename;
    }

    public void setSurname (String surname) {
        this.surname = surname;
    }

    public void setPaper1Grade (int paper1Grade) {
        this.paper1Grade = paper1Grade;
    }

    public void setPaper2Grade (int paper2Grade) {
        this.paper2Grade = paper2Grade;
    }

    public void setPaper3Grade (int paper3Grade) {
        this.paper3Grade = paper3Grade;
    }

    public void setPaper1Outcome (String paper1Outcome) {
        this.paper1Outcome = paper1Outcome;
    }

    public void setPaper2Outcome (String paper2Outcome) {
        this.paper2Outcome = paper2Outcome;
    }

    public void setPaper3Outcome (String paper3Outcome) {
        this.paper3Outcome = paper3Outcome;
    }

    public void setFileInRowID (int fileInRowID) {
        this.fileInRowID = fileInRowID;
    }

    public void setFailCount (int failCount) {
        this.failCount = failCount;
    }

    public void setGradeAverageRounded (int gradeAverageRounded) {
        this.gradeAverageRounded = gradeAverageRounded;
    }

    public void setGradeAverageQualified (int gradeAverageQualified) {
        this.gradeAverageQualified = gradeAverageQualified;
    }

    public void setExamOutcome (String examOutcome) {
        this.examOutcome = examOutcome;
    }


//  (2) Constructor Methods
//  (-) Constructor Method - No Arguments
    public Exam () {
        this.studentNumber = "";
        this.forename = "";
        this.surname = "";
        this.paper1Grade = 0;
        this.paper2Grade = 0;
        this.paper3Grade = 0;
        this.paper1Outcome = "";
        this.paper2Outcome = "";
        this.paper3Outcome = "";
        this.fileInRowID = 0;
        this.failCount = 0;
        this.gradeAverageRounded = 0;
        this.gradeAverageQualified = 0;
        this.examOutcome = "";
    }

//  (-) Constructor Method - With Arguments (1)
    public Exam (
            String studentNumber,
            String forename,
            String surname,
            int paper1Grade,
            int paper2Grade,
            int paper3Grade,
            String paper1Outcome,
            String paper2Outcome,
            String paper3Outcome,
            int fileInRowID,
            int failCount,
            int gradeAverageRounded,
            int gradeAverageQualified,
            String examOutcome) {
        this.studentNumber = studentNumber;
        this.forename = forename;
        this.surname = surname;
        this.paper1Grade = paper1Grade;
        this.paper2Grade = paper2Grade;
        this.paper3Grade = paper3Grade;
        this.paper1Outcome = paper1Outcome;
        this.paper2Outcome = paper2Outcome;
        this.paper3Outcome = paper3Outcome;
        this.fileInRowID = fileInRowID;
        this.failCount = failCount;
        this.gradeAverageRounded = gradeAverageRounded;
        this.gradeAverageQualified = gradeAverageQualified;
        this.examOutcome = examOutcome;
    }

//  (-) Constructor Method - With Arguments (2)                                      
    public Exam (
            String studentNumber,
            String forename,
            String surname,
            int paper1Grade,
            int paper2Grade,
            int paper3Grade) {
        this.studentNumber = studentNumber;
        this.forename = forename;
        this.surname = surname;
        this.paper1Grade = paper1Grade;
        this.paper2Grade = paper2Grade;
        this.paper3Grade = paper3Grade;
        this.paper1Outcome = "";
        this.paper2Outcome = "";
        this.paper3Outcome = "";
        this.fileInRowID = 0;
        this.failCount = 0;
        this.gradeAverageRounded = 0;
        this.gradeAverageQualified = 0;
        this.examOutcome = "";
    }


//  (6) Main Method
    public static void main (String[] args) throws Exception {

        Exam.readFile ();                                                            
    }


//  (7) Other Methods

//  (-) Read File Into Instances Of Exam Class
    //  limitation: hard coded to 6 column source file
    public void readFile () throws Exception {

        try {                                                                        

            fileIn = new Scanner(new BufferedReader(new FileReader(InFilePath)));

        int i = 0;

        while (fileIn.hasNextLine ()) {                                              

            line = fileIn.nextLine();

            splitLine = line.split (",", 6);

            //  create instances of exam from file data and calculated data
            exam [i] = new Exam (
                    splitLine [0],
                    splitLine [1],
                    splitLine [2],
                    Integer.parseInt (splitLine [3]),
                    Integer.parseInt (splitLine [4]),
                    Integer.parseInt (splitLine [5]),
                    convertGradeToOutcome (paper1Grade),
                    convertGradeToOutcome (paper2Grade),
                    convertGradeToOutcome (paper3Grade),
                    i + 1,
                    failCount (),
                    gradeAverageRounded (),
                    gradeAverageQualified (),
                    convertGradeToOutcome (gradeAverageQualified));

            fileIn.nextLine ();                                                      
            i ++;
        }

        classExamGradeFrequency ();
        classExamGradeSum ();
        classExamGradeAverage ();

        //  close file                                                               
        fileIn.close ();

        } catch (FileNotFoundException | NumberFormatException e) {

//            fileIn.next ();                                                        
            System.err.println("Error: " + e.getMessage());
            //System.out.println ("File Error - IO Exception");
        }

        for (Exam i : exam) {
            System.out.println(i.toString());
            System.out.println();
        }

//        System.out.println(classExamGradeSum);
//        System.out.println();
        System.out.println(classExamGradeAverage);
        System.out.println();
        System.out.println(classExamGradeFrequency);
        System.out.println();

    }


//  (-) Fail Count (1 Student, 3 Papers)
    public int failCount () {
//
        if (paper1Grade > 6){
            failCount = failCount + 1;
        }
        if (paper2Grade > 6){
            failCount = failCount + 1;
        }
        if (paper3Grade > 6){
            failCount = failCount + 1;
        }
        return failCount;
    }


//  (-) Grade Average Rounded (1 Student, 3 Papers)
    public int gradeAverageRounded () {

        gradeAverageRounded = (int) Math.ceil(
            (paper1Grade + paper2Grade + paper3Grade) / 3);

        return gradeAverageRounded;
    }


//  (-) Grade Average Qualified (1 Student, 3 Papers)
    public int gradeAverageQualified (){

        gradeAverageQualified = gradeAverageRounded;                                 

        if (failCount >= 2 && gradeAverageRounded <= 6) {
            gradeAverageQualified = 7;
        }

        return gradeAverageQualified;
    }


//  (-) Convert Grade to Outcome (Pass / Fail)
    public String convertGradeToOutcome (int grade) {
        String outcome;

        if (grade <= 6){
            outcome = "Pass";
        } else if (grade > 6){
            outcome = "Fail";
        } else {
            outcome = "Unknown (Error)";
        }

        return outcome;
    }


//  (-) Class Exam Grade Sum (All Students, All Papers)
    /** assumption: average grade for class is average of grades awarded,
     *  using rounded figures, not raw per paper results
     */
    public void classExamGradeSum () {

        classExamGradeSum = 0;

        //  for each loop (to iterate through collection of exam instances)
        for (Exam i : exam) {
            classExamGradeSum = classExamGradeSum + i.gradeAverageQualified;
        }
    }


//  (-) Class Exam Grade Average (All Students, All Papers)
    /** assumption: average grade for class is average of grades awarded,
     *  using rounded figures, not raw per paper results
     *  assumption: <fileInRowCount> is correct                                      
     */
    public double classExamGradeAverage () {

        classExamGradeAverage = classExamGradeSum / fileInRowCount;

        return classExamGradeAverage;
    }


//  (-) Class Exam Grade Frequency (Count of Instances of Each Final Grade)
    /** Example:
     *  frequency of average grade "5"
     *  is stored in array <classExamGradeFrequency [4]>
     */
    public void classExamGradeFrequency () {

        //  for each loop (to iterate through collection of exam instances)
        for (Exam i : exam) {
            classExamGradeFrequency [i.getGradeAverageQualified () - 1] ++;
        }
    }


}// endof class
4

1 に答える 1

3

readFileインスタンスメソッドです。Exam使用するインスタンスを作成します。

new Exam().readFile();

Examは多くのインスタンス変数があり、そのうちのいくつかはreadFileメソッドで使用されるため、このメソッドは静的であってはなりません。(staticクラス変数の使用はコードの臭いを生むため、考慮すべきではありません。)

readFileがファイルから複数のエントリを多くのオブジェクトに読み取ることを考えると、読み取り機能を新しいクラスExamに分割できます。ExamReader

余談:柔軟性のためListに、固定サイズの配列の代わりに a を使用します

Exam exam [];

になり得る

List<Exam> examList; 
于 2013-02-10T16:06:13.533 に答える