2011-10-31 2 views
1

나는 자바를 배우며 수업을 시작했으며 현재 몇 가지 의구심이있다.자바 클래스 및 스캐너

나는 학생, 수업 및 의자의 데이터로 프로그램을 만들 예정입니다. 예를 들어 학생 데이터의 정보는 교실과 의자에서 사용됩니다. 당분간, 나는 자신을 학급 학생으로 제한 할 것이다.

각 학생의 이름과 생년월일이 표시됩니다. 학생 데이터가있는 클래스를 만든 다음 학생의 데이터를 두 개의 배열로 저장한다고 생각했습니다. 이름에 대한 문자열의 1 차원 배열과 날짜 (연, 월, 일)에 대한 세 개의 열이 포함 된 배열입니다.

나는 코드와 학생 클래스를 생성하여 시작 :

다음 주 파일에 이런 식으로 생각했던
public class Stundent{ 
     private String nameStudent; 
     private int yearBirth; 
     private int monthBirth; 
     private int dayBirth; 

     public void setName(String name){ 
      System.out.println("Insert student's name:"); 
      nameStudent = name; 

     } 
     public String getName(){ 
      return nameStudent; 
     } 
     public void setYear(int year){ 
      System.out.println("Insert student's year of birth:"); 
      yearBirth = year; 
     } 
     public int getYear(){ 
      return yearBirth; 
     } 
     public void setMonth(int month){ 
      System.out.println("Insert student's month of birth:"); 
      monthBirth = month; 
     } 
     public int getMonth(){ 
      return monthBirth; 
     } 
     public void setDay(int day){ 
      System.out.println("Insert student's day of birth:"); 
      dayBirth = day; 
     } 
     public int getDay(){ 
      return dayBirth; 
     } 
    } 

:

  Student person = new Student(); 
      String[] nameStudents = new String[100]; 
      int[][] birthdayStudents = new int[100][3]; 
      for (int i = 0; i < 3; i++){ 

       person.setName(sc.nextLine()); 
       nameStudents[i] = person.getName(); 

       person.setAno(sc.nextInt()); 
       birthdayStudents[i][1] = person.getAno(); 

       person.setMes(sc.nextInt()); 
       birthdayStudents[i][1] = person.getMes(); 

       person.setDia(sc.nextInt()); 
       birthdayStudents[i][2] = person.getDia(); 

      } 

첫 번째 질문 :

잊고을 이 스캐너가 올바른 생각일까요? 나는 다음과 같은 상황이이 코드를 실행하면

:

두 번째 질문은 그것은 나에게 제공 될 것 "학생의 이름을 삽입 :"하지만 난 배치하면 마리아 InputMismatchException가 나타납니다. 나는 그가 올해 마리아를 저장하고 있다고 생각한다. 왜 이런 일이 발생합니까? 동일한 사이클에서 스캐너를 두 번 이상 호출 할 수 없습니까? 난 단지 코드에 넣어 경우

person.setName(sc.nextLine()); 
nameStudents[i] = person.getName(); 

하고 확인을 작동 생일 관련된 다른 모든 것들을 제거합니다. 누구든지 나를 계몽 할 수 있습니까?

+0

을 @NickLH 예. 내가 제공 한 코드가 아니지만 스캐너를 초기화했습니다. – Favolas

답변

1

나는 그것이 당신이 올바른 방법으로 생각하지 않습니다. 엔터티 학생을 입력 관련 정보와 섞습니다. (약간 감소 학생)를 다음과 같이 나는 그것을 재 설계 것 :

/* just an entity, no logic at all */ 
public class Student { 
    private String name = null; 
    private Integer year = null; 

    public void setName(String name){ 
     this.name = name; 
    } 

    public void setYear(Integer year){ 
     this.year = year; 
    } 
} 

그리고 논리는 사용자 입력을 얻을 :

List<Student> students = new ArrayList<Student>(); 
int numberOfStudents = 3; 

for (int i = 0; i < numberOfStudents; i++){ 
    System.out.println("Please enter name:"); 
    String name = sc.nextLine(); 

    System.out.println("Please enter year:"); 
    Integer year = sc.nextInt(); 

    /* after gathering the input create student */ 
    Student s = new Student(); 
    s.setName(name); 
    s.setYear(year); 

    students.add(s); 
} 
+0

감사합니다. 이것은 단지 이름입니다. 나는 그 날짜들과 똑같이해야한다. 권리? Arraylist (배열 만)를 배우지 않았으므로 코드를 완전히 이해할 수 없습니다. 죄송합니다 – Favolas

+0

정확하게, 약간 수정 내 대답 - 추가 년. Btw : 객체 지향 방식으로 생각하십시오 :-) – home

0

학생 개체 자체를 목록에 저장하면 어떨까요? 당신은 스캐너에서 정보를 검색 할 때 당신이 그들에 대한 몇 가지 유효성 검사를 할 수 있도록

List<Student> studentList = new ArrayList<Student>(); 
studentList.add(student); 

또한, 임시 객체 (이름, 나이 등 같은) 정보의 그 조각을 할당합니다.

String temp = sc.nextLine(); 

"temp"를 확인하고 원하는 사람 이름에 저장하려면 그 사람의 수업에서 setter를 호출하십시오.

Object에서 setter 메서드를 호출하기 전에 사용자 입력의 유효성을 검사하는 것이 좋습니다.

0

메인 블록의 코드와 Stundent (맞춤법 오류에 유의하십시오) 클래스의 코드간에 정보를 수집하는 책임을 나누는 것 같습니다.

I 클래스의 책임이 무엇인지에 대해 생각하고, 직접 그 클래스의 responsbility을 처리하지 않습니다 클래스 내에 추가 코드가없는 것을 확인에 집중할 것입니다. 예를 들어, Student이 이름을 유지해야하는 경우 이름 필드는 Student 안에 있어야합니다 (이 방법을 사용하면 많은 의미가 있습니다).그러나 학생 이름을 업데이트하려는 경우 Studentprintln 문을 통해 이름을 지정한 후에 이름이 필요하다는 메시지를 표시하는 것은 의미가 없습니다.

아마도 입력을 읽고 Student 개체를 생성 할 수있는 StudentReader 클래스가 필요합니다. 그러한 독자는 올바른 모든 프롬프트 및 값 판독을 수행하는 독점적 인 책임을 가지며 최종 결과는 단일 구성된 Student입니다. 그런 다음 기본 블록은 기본적으로 각 학생을 StudentReader으로 읽고 섹션을 읽고 Student을 수집하고 적절하게 처리하는 루프가됩니다.