2011-10-31 107 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并相应地处理它们。