import java.util.Scanner;
class stu_score{
String num;
String name;
int score[];
double aver;
char gra; //절대평가
int rank; //상대평가
}
public class Score_1302{
public static void main(String args[]){
Scanner in = new Scanner(System.in);
System.out.print("학생 수 입력 : ");
int stu_num=in.nextInt();
stu_score stu_s[] = new stu_score[stu_num+1];
String subj[] = {"국어","영어","수학","자바"};
for(int i=0; i<stu_num; i++){ //학생 수 만큼 돌아간다. 왜냐면 한 학생의 점수를 전부 입력하기 때무니다.
System.out.print("학번 : ");
stu_s[i].num = in.next();
System.out.print("이름 : ");
stu_s[i].name = in.next();
stu_s[i].score=new int[5];
for(int j=0; j<4; j++) {
do{
System.out.print(subj[j]+"점수 : ");
stu_s[i].score[j] = in.nextInt();
}while((0>stu_s[i].score[j] || stu_s[i].score[j]>100));
}
stu_s[i].score[4] = method_sum(stu_s[i].score[3],stu_s[i].score[2],stu_s[i].score[1],stu_s[i].score[0]);
stu_s[i].aver= (double)stu_s[i].score[4]/4;
switch((int)stu_s[i].aver/10){
case 9: case 10: stu_s[i].gra='A'; break;
case 8: stu_s[i].gra='B'; break;
case 7: stu_s[i].gra= 'C'; break;
case 6: stu_s[i].gra = 'D'; break;
default : stu_s[i].gra='E';
}
System.out.println();
stu_s[i].rank = 1;
}
in.close();
for(int i=0; i<stu_num-1; i++){
for(int j=i+1; j<stu_num; j++){
if(stu_s[i].score[i]>stu_s[i].score[j]) stu_s[i].rank++;
else if(stu_s[i].score[i]<stu_s[i].score[j]) stu_s[i].rank++;
}
}
for(int i=0; i<stu_num; i++){
System.out.printf("%5s %7s %5d %5d %5d %5d %6d %8.2f %5c %5d\n",stu_s[i].num,stu_s[i].name,stu_s[i].score[0],stu_s[i].score[1],stu_s[i].score[2],stu_s[i].score[3],stu_s[i].score[4],stu_s[i].aver,stu_s[i].gra,stu_s[i].rank);
}
//학번순 출력
/*
else if(menu==2) {
for(int i=0; i<stu_num; i++) {
for(int j=i; j<stu_num-1; j++) {
}
}
}
*/
}//end of main
static int method_sum(int kor, int eng, int math, int java){
return (kor+eng+math+java);
}
}
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "num" because "stu_s[i]" is null
at Score_1302.main(Score_1302.java:26)
각 배열 요소를 인스턴스화
왜 각 배열 요소의 인스턴스화를 해야되고 그게 무엇인가...
배열의 선언만으로 각 요소가 객체로서 초기화되지 않아서이다.
class명 배열이름 = new 클래스[배열개수];
는
그냥 해당 클래스 타입의 객체 배열을 만든거다.
아직 클래스 객체를 직접 참조하지 않았다.
그래서 전부 null로 초기화 되어있다.
그렇기에 for문을 돌려 전부 class의 객체를 직접 가르키도록 해주는 것이다.
대박 java신님 감사합니다.