2013-12-10 3 views
3
import java.util.Scanner; 

class DataInput { 
String name[]; 
int korean[], math[], english[]; 
int sum[]; 
double average[]; 
int students; 
int rank[]; 

public void save() { 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Type in number of students"); 
    students = sc.nextInt(); 

    name = new String[students]; 
    korean = new int[students]; 
    math = new int[students]; 
    english = new int[students]; 
    sum = new int[students]; 
    average = new double[students]; 
    rank = new int[students]; 

    for (int i = 0; i < students; i++) { 
     System.out.println("Type name"); 
     name[i] = sc.next(); 
     System.out.println("Type Korean score"); 
     korean[i] = sc.nextInt(); 
     System.out.println("Type math score"); 
     math[i] = sc.nextInt(); 
     System.out.println("Type English score"); 
     english[i] = sc.nextInt(); 

     sum[i] = korean[i] + math[i] + english[i]; 
     average[i] = sum[i]/3.0; 

    } 

} 

int stu() { 
    return students; 
} 

int[] sum() { 
    return sum; 
} 

} 

class DataOutput { 
DataInput data = new DataInput(); 
int sNum; 
int[] rrank, sum; 

DataOutput(int students, int[] sum) { 
    this.sNum = students; 
    this.rrank = new int[sNum]; 
    this.sum = sum; 
} 

void ranker() { 

    int cnt = 1; 

    for (int i = 0; i < sNum; i++) { 
     for (int j = 0; j < sNum; j++) { 
      if (sum[i] < sum[j]) { 
       cnt++; 
      } 
     } 
     rrank[i] = cnt; 
     cnt = 1; 
    } 

} 
} 

public class Score { 
public static void main(String[] args) { 

    DataInput data = new DataInput(); 
    int sNum = data.stu(); 
    int[] sum = data.sum(); 
    DataOutput out = new DataOutput(sNum, sum); 
    data.save(); 
    out.ranker(); 

    System.out.println(); 
    System.out.println("Name\t\tKorean math English \t sum Average Rank"); 
    System.out 
      .println("-------------------------------------------------------"); 

    for (int i = 0; i < data.stu(); i++) { 
     System.out.println(data.name[i] + "\t\t" + data.korean[i] + " " 
       + data.math[i] + " " + data.english[i] + "\t" 
       + data.sum[i] + " " + data.average[i] + " " 
      + out.rrank[i]); // this is where i get an Exception 
    } 

} 

} 

그래서, 이것은 학생들의 순위를 얻는 나의 프로그램입니다. 하지만 어떻게 든 코드를 실행하면 "OutOfBoundaryException"이 계속 나타납니다. 내 코드를 확인하고 DataOutput의 새 인스턴스를 인스턴스화하면 모든 새 데이터가 만들어집니다. 그래서 생성자를 설정하여이 문제를 해결하려고했습니다. 그러나 나는 아직도이 문제를 해결할 수 없다. 나는 ranker 메소드를 DataInput 클래스에 넣을 수 있으며, 문제는 쉽게 해결할 수 있지만 실제로 DataOutput 클래스를 유지하고자한다는 것을 알고 있습니다."OutOfBoundaryException"오류를 어떻게 해결할 수 있습니까?

감사합니다.

PS : 예외는 라인 (98)에 발생되어 상기 save() 메소드가 호출 될 때까지 [I]

+1

예외는 무엇입니까? 전체 스택 추적을 볼 수 있습니까? –

답변

2

students 필드가 설정되어 있지 않은 out.rrank. mainsNum 값은 0입니다.

변경에 main의 순서 :

DataInput data = new DataInput(); 
data.save();// <-- 
int sNum = data.stu(); 
int[] sum = data.sum(); 
DataOutput out = new DataOutput(sNum, sum); 
out.ranker(); 
+1

더 좋은 방법은 sNum을 사용하지 말고 sum.length에 대한 프록시로 사용되는 것으로 간주됩니다. –

+0

@Johnbot. 그걸 보지 못했어요! 당신의 도움을 주셔서 감사합니다! – Muon

1

문제는 당신은 내가 당신이 수집 학생들 후 초기화하는 것이 좋습니다 soultion으로/생성, 학생들 전에 순위 []를 초기화 점수이었다

public void init(int students, int[] sum){ 
     this.sNum = students; 
     this.rrank = new int[sNum]; 
     this.sum = sum; 
} 

및 업데이트 메인()

DataOutput out = new DataOutput(); 
    data.save(); 

    int sNum = data.stu(); 
    int[] sum = data.sum(); 
    out.init(sNum, sum); 
    out.ranker(); 
+0

@Johnbot 솔루션이 더 좋습니다. –

관련 문제