2011-10-31 108 views
1

我正在學習java並從類開始,現在我有一些疑惑。Java類和掃描器

我打算用學生,課堂和椅子的數據製作一個程序。例如,來自學生數據的信息將被用在教室和椅子上。現在,我會限制自己去上課。

每個學生都會有一個姓名和出生日期。 我想我會用學生數據創建一個班級,然後將學生的數據保存在兩個數組中。名稱的一維字符串數組和日期(年,月,日)三列的數組。

我開始用代碼創建Student類:

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

確切地說,稍微修改了我的答案 - 增加了一年。順便說一句:認爲面向對象的方式:-) – home

0

將Student對象自己保存在列表中怎麼辦?

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

此外,當您從掃描儀獲取信息,分配信息的那些片段(如姓名,年齡等)來臨時對象,所以你可以做他們一些驗證。

String temp = sc.nextLine(); 

驗證「temp」,如果它是你想存儲在該人的名字中,然後從該人的類中調用setter。

在您調用對象的任何setter方法之前驗證用戶輸入總是一個好主意。

0

您似乎在分割收集主代碼中的代碼和Stundent(注意拼寫錯誤)類中的代碼之間的信息的責任。

我會集中精力考慮班級的職責是什麼,並確保班級內沒有其他代碼不直接處理班級的責任。例如,如果Student要保持其名稱,那麼名稱字段應該在Student之內(您這樣做了,這很有意義)。但是,如果要更新學生姓名,Student通過println聲明提示您在爲其指定了一個名稱後期待一個名稱是沒有意義的。

也許你需要一個StudentReader類,它可以讀取輸入,然後構造Student對象。這樣的讀者將有唯一的責任去做所有正確的提示和讀取值,最終的結果是構建一個單一的Student。然後,主要塊將基本上是一個循環讀取每個學生與StudentReader和一節收集讀取Student s並相應地處理它們。