2013-02-10 2 views
0

오류 : 정적 컨텍스트에서 비 정적 메서드를 참조 할 수 없습니다.(Another) "정적 컨텍스트에서 비 정적 메서드를 참조 할 수 없습니다."문제

제 경우에는이 메소드를 readFile()이라고합니다.

안녕하세요. 무수한 초심자 프로그래머들이 이전에 경험했던 것과 같은 오류가 발생했습니다. 그러나 몇 시간 동안 그것을 읽었음에도 불구하고, 나는 내 상황에서 그 지식을 적용하는 법을 배울 수 없습니다.

클래스의 전체 텍스트를 포함 할 수 있도록 코드를 재구성해야 할 수도 있습니다.

main() 메서드를 작은 Main 클래스에 포함하는 것을 선호하지만 여기서는 단순하게하기 위해 동일한 클래스에 배치했습니다. 내가 어디에 놓든 동일한 오류가 발생합니다.

readFile() 메서드는 main() 메서드 내에 쉽게 배치 할 수 있지만이 같은 작은 모듈 식 메서드를 만드는 방법을 배우고 main() 메서드에서 호출하는 방법을 배우는 것이 좋습니다. 원래 closeFile()도 별도의 메소드였습니다.

  1. 이 시험에 관한 파일 데이터로부터 판독
  2. 가 정보의 계산 결과
  3. 출력 계산을 수행하는 결과 상위 .DAT 파일을여

    은 프로그램이 예정되어

파일의 각 줄은 학생 개인 정보입니다.
한 장은 세 개의 시험지로 구성됩니다.
대부분의 계산은 개별 학생을 고려합니다.
그러나 일부 계산은 전체 학생 컬렉션 (즉, 해당 클래스)을 고려합니다.

NB : 여기서 "class"는 코드에서 사용되는 것으로, OO 프로그래밍의 의미에서 클래스가 아닌 학생의 학업 클래스를 나타냅니다.

문제를 해결하기 위해 다양한 방법을 시도했습니다.

현재 접근 방식은 "시험"클래스의 인스턴스에서 단일 학생 시험과 관련된 데이터를 저장하는 것입니다.
이것은 입력 파일의 한 줄에 해당 인스턴스의 다른 속성과 관련된 후속 계산에 해당합니다.

이 속성은 readFile()의 while 루프 중에 값으로 채워집니다.
while 루프가 끝나면 전체 시험 수집에 관련된 세 가지 계산이 호출됩니다 (예 : 전체 학급).

보조 질문 :
나는 (키워드 정적으로) 클래스 변수로 정의해야한다고 생각하는 경우 : 주석 "속성 선언"에서
, 나는 두 개의 하위 그룹으로 클래스의 속성을 분리했습니다.
인스턴스 변수로 정의해야한다고 생각하는 항목.
첫 번째 그룹의 키워드에 정적 키워드를 추가해야하는지 여부에 대해 안내해주세요.

관련 질문 :
전체 인스턴스 컬렉션을 사용하여 계산을 수행하는 메서드를 정적/클래스 메서드로 선언해야합니까?
시도했을 때 인스턴스 메소드를 호출 할 때 비슷한 오류가 발생했습니다.

감사합니다.

추신 :이 포럼과 관련 :
코드 블록으로 코드를 묶었지만 자바 구문이 강조 표시되지 않았습니다.
게시물을 제출 한 후 변경 될 수 있습니다. 하지만 누군가가 어떻게 말해 줄 수 있다면 기꺼이 재 형식화 해 드리겠습니다.

PPS : 숙제입니다.
아래 코드를 모두 작성했습니다.
"숙제"태그는 사용되지 않으므로 사용하지 않았습니다.


입력 파일 이름 : "results.dat"
입력 파일 경로 : "C :/사용자/ADMIN/데스크탑/A1P3E1 파일은/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 

자바 파일 이름 : "Exam.java"
자바 패키지 이름 : "a1p3e1"
자바 프로젝트 이름 : "A1P3E1" 자바 파일 내용 :

/** 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 

답변

3

readFile 인스턴스 방법입니다. Exam의 인스턴스가 사용하는 만들기 :

new Exam().readFile(); 

ExamreadFile 방법에 사용되는 일부의 많은 인스턴스 변수를 가지고 있음을 감안할 때,이 방법은 정적 안된다. ( static 클래스 변수의 사용은 코드 냄새를 만들고 간주되어서는 안됩니다.)

readFile 많은 Exam 객체로 파일에서 여러 항목을 읽 감안할 때, 당신은 새로운 ExamReader 클래스로 읽기 기능을 분리 할 수있다. 이외에도

:는 유연성을

List<Exam> examList; 
+0

확인 될 수 대신 고정 된 크기 어레이

Exam exam []; 

List를 사용한다. 하지만 (전체 파일을 컨텍스트로 가져 가면) : 1. _should_ {readFile()}이 인스턴스 메소드가 될까요? 2. readFile은 {new Exam()}의 복수 인스턴스를 만듭니다. – Default300

+0

회신을 시도합니다!
확인. 하지만 (전체 파일을 컨텍스트로 가져가는 경우) :
1. "readFile()"이 인스턴스 메소드가 될까요?
2."readFile()"은 여러 개의 "new Exam()"인스턴스를 만듭니다.
PS : Re forum,이 회신 편집기에서 코드 서식을 지정하는 방법 (예 : Enter 키를 누르면 줄 바꿈을 삽입하는 대신 답장 함) – Default300

+0

@ Reimeus 그런 다음 Main(), readFile() 및 다른 변수와 메서드를 저장할 다른 클래스가 있어야하나요? (그냥 타이핑하는 동안 당신이 sugggested 보았다.) 추신 : 포럼에서 모든 linebreaks 다시. – Default300

관련 문제