Java类和Scanner

时间:2011-10-31 14:51:01

标签: 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();

            }

第一个问题:

忘记这是因为扫描仪无法正常工作,这是正确的思考方式吗?

第二个问题:

如果我运行此代码,我会遇到以下情况: 它将呈现给我“插入学生的名字:”但如果我放置Maria InputMismatchException将会出现。我相信他会在这一年里存放Maria。 为什么会这样?在相同的循环中,我不能多次调用扫描仪? 如果我只输入代码:

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

并删除有关生日的一切其他工作正常。 谁能开导我?

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

如何将Student对象本身保存在列表中呢?

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

此外,当您从扫描仪中检索信息时,请将这些信息(如姓名,年龄等)分配给临时对象,以便对其进行一些验证。

String temp = sc.nextLine();

验证“temp”,如果它是您想要存储在此人姓名中的内容,则从该人的班级中调用setter。

在对象上调用任何setter方法之前验证用户输入始终是个好主意。

答案 2 :(得分:0)

您似乎正在划分在主要区块中的代码与Stundent(注意拼写错误)类中的代码之间收集信息的责任。

我会专注于思考类的职责是什么,并确保类中没有额外的代码,而这些代码不直接处理该类的响应性。例如,如果Student要保持其名称,则名称字段应该在Student内(您这样做了,这很有意义)。但是,如果要更新学生的名称,Student通过println语句提示在您为其指定了一个名称之后,它正在期待一个名称是没有意义的。 / p>

也许您需要一个StudentReader类,它可以读取输入,然后构造Student对象。这样的读者将具有完成所有正确的提示和读取值的唯一责任,最终结果是单个构造的Student。然后主要部分基本上是一个循环来读取每个学生StudentReader和一个部分来收集阅读Student并相应地处理它们。