2012-06-11 1 views
0

저는 Java에 대한 첫 프로그래밍 할당 작업을하고 있는데 또 다른 질문이있었습니다. Student []의 내부에 Course []를 넣었지만 NullPointerException 오류가 발생하는 것 같아서 그 이유를 알 수 없습니다. 교육 과정은 교육 과정에 대한 정보를 가지고이 방법으로 "courses"의 데이터에 돌아가거나 어떻게 든 액세스 할 수 있습니까?

3 345 
Lisa Miller 890238 Y 2 
Mathematics MTH345 4 A 
Physics PHY357 3 B 


Bill Wilton 798324 N 2 
English ENG378 3 B 
Philosophy PHL534 3 A 

하고, 학생들은 학생에 대한 정보가 있습니다

public Student[] analyzeData() { 
    Scanner inputStream = null; 

    try { 
     inputStream = new Scanner(new FileInputStream("Programming Assignment 1 Data.txt")); 
    } catch (FileNotFoundException e) { 
     System.out.println("File Programming Assignment 1 Data.txt could not be found or opened."); 
     System.exit(0); 
    } 

    int numberOfStudents = inputStream.nextInt(); 
    int tuitionPerHour = inputStream.nextInt(); 

    Student[] students = new Student[numberOfStudents]; 
    for (int i = 0; i < numberOfStudents; i++) { 
     String firstName = inputStream.next(); 
     String lastName = inputStream.next(); 
     int studentID = inputStream.nextInt(); 
     String isTuitionPaid = inputStream.next(); 
     int numberOfCourses = inputStream.nextInt(); 


     Course[] courses = new Course[numberOfCourses]; 
     for (i = 0; i < numberOfCourses; i++) { 
      String courseName = inputStream.next(); 
      String courseNumber = inputStream.next(); 
      int creditHours = inputStream.nextInt(); 
      String grade = inputStream.next(); 
      Course currentCourse = new Course(courseName, courseNumber, creditHours, grade); 
      courses[i] = currentCourse; 
     } 
     Student currentStudent = new Student(firstName, lastName, studentID, isTuitionPaid, numberOfCourses, courses); 
     students[i] = currentStudent; 
    } 
    return students; 
} 

입력 파일의 형식이다.

+0

이클립스를 사용하는 경우 우선 Ctrl + Shift + F를 눌러보십시오. 자동 형식이므로 좋은 formating을 사용하는 습관에 들어갈 때까지 코드를 읽기 쉽게 만듭니다. 너 스스로. – gbtimmon

+0

'NullPointerException'이 발생하는 곳을 지정할 수 있습니까? 파일을 찾지 못하면'inputStream'이 null이기 때문에 Scanner 객체와 관련된 모든 코드가'try ... catch' 블록 안에 캡슐화되어야한다고 추측 할 수 있습니다. – Makoto

답변

1

학생이 복용하는 클래스가 포함 된 Student에 배열 (또는 더 나은 것은 ArrayList 또는 Map)을 추가합니다.

당신이하고있는 일과 함께 어떤 학급이 어떤 학생과 합쳐질 지 어떻게 결정하고 있습니까? 다음 메소드를 구현, Student

private List<Course> courses; 

변수는 다음 인스턴스를 추가

봅니다 목록에 추가하거나 전체를 돌아갑니다.

void addCourse(Course c) { /*code here*/ }; 
    List getCourses() {/* code here */} ; 

파일을 읽는 것이 정말 고통 스러울 수 있습니다. 현재 갖고있는 것은 괜찮습니다. Course이 인스턴스화되는 루프에는 student.addCourse(course)이라는 호출이 포함됩니다. 그럼 당신은 황금이 될거야.

여기는 상위 수준의 개요이므로 여기에 몇 가지 학습 내용이있을 수 있습니다. 다시 게시하면 도움을 드리겠습니다.

+0

교수는 우리가 목록을 사용하지 말 것을 요청했고, 불행하게도 그것을 만드는 법을 실제로 모른다. 제 계획은 각 학생 다음에 모든 수업을 읽고 학생들에게 배정하는 방법으로 사용했습니다. 기본적으로 좀 더 형식화 된 방식으로 인쇄하기 위해서는 변수가 필요합니다. – AlphaOmegaStrife

+0

리스트를 사용할 수 없다면, 학생 클래스에'private Course [] courses' 필드와 학생에게 코스를 할당하기위한'setCourse (Course [] courses)'(또는 추가로'Course [ ]'인수를 학생 생성자에게 전달합니다. –

+0

목록과지도를 좋아할 것입니다. 꽤 우아하지 않더라도 위의 기술을 배열과 함께 사용할 수도 있습니다. 요점은 학생들에게 수업을 묶어 조직적인 고통이 사라지는 것입니다. –

2

파일의 자연 개체 매핑은 각각 Course 개체 목록을 포함하는 Student 개체 목록입니다. courses 배열은 학생 개체 내에 저장해야합니다.

+0

나는 downvoter 아니지만, 당신의 대답은 주제와 관련이 없으며 질문과 관련이 없으며, 근거가없는 파일의 할당/구조에 대한 가정을하기 때문에 나는있을 수 있습니다. implicit 오브젝트 맵핑이 없거나 해당 맵핑을 + 시하는 파일 읽기 기능이없는 파일 목록을 학생 목록으로 작성한 후 코스 목록에 포함시키는 것이 가장 이상적입니다. – gbtimmon

+0

실제로 파일과 코드를 읽는 데 사용 된 코드를 보았습니까? 각 학생 회선에는 여러 개의 과목이 있으며, 다음과 같은 선은이 학생의 과목입니다 (한 과목 당 한 줄). 그것은 주제와는 거리가 멀습니다 : 데이터가 어떻게 구성되어 있는지, 객체가 어떻게 디자인되어야하는지입니다. 그리고 학생들의 목록을 반환하면 모든 것을 반환합니다 : 학생과 그들의 과정. ** ** 관계입니다. –

+0

주어진 샘플 파일은 코스를 학생들에게 묶는 것을 명확히 보여줍니다. –

2

흠, 이렇게하는 방법은 메모리의 구문 분석 된 파일을 나타내는 데이터 구조입니다. 그래서 기본적으로 이런 식으로 뭔가 보일 것 :

public class RegistrationFile{ 

    private Students[] students; 
    private Courses[] courses; 

    public void loadFromFile(File f){ 
    //do your logic to parse the file 
    //and store the results in the appropriate data members 
    } 

    public Students[] getStudents(){ 
    return students; 
    } 

    public Courses[] getCourses(){ 
    return courses; 
    } 
} 

다른 코드에서를, 당신은 다음 등록 파일 개체의 인스턴스를 생성하고 당신은 아무것도에 액세스하기 전에 데이터를로드 할 수 loadFromFile()을 부를 것이다.

0

(@ChrisThompson에서와 같이) 학생/코스를 나타내는 데 적합한 개체를 설정하는 것 외에도 학생/코스의 모든 레코드를 읽을 수 있기를 원할 것입니다.

파일을 적절히 구문 분석해야합니다. 예를 들어 빈 줄을 치면 다음 레코드로 이동한다는 것을 알게됩니다 (첫 번째 레코드 제외). 또한 첫 번째 줄이 학생 (또는 5 개의 토큰이있는 경우)이고 후속 줄이 코스 (또는 줄에 4 개의 토큰이있는 경우)를 활용하십시오.

이 단위는 전체 입력 파일에 대해 루프에서 하나의 반복을 구성해야합니다. 주어진 학생 객체와 그의 코스 객체를 하나의 루프 반복으로 만듭니다.

관련 문제