Классы Java и сканер

#java

#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. Я полагаю, что он хранит Марию в течение года. Почему это происходит? В том же цикле for у меня не может быть более одного вызова сканера? Если бы я только ввел код:

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

и удалите все остальное, касающееся дня рождения, все будет работать нормально.
Кто-нибудь может меня просветить?

Комментарии:

1. @NickLH Да. Хотя его нет в коде, который я предоставил, я инициализировал сканер.

Ответ №1:

Я думаю, что вы делаете это неправильно. Вы смешиваете объект Student с информацией, связанной с вводом. Я бы перепроектировал его следующим образом (немного сокращенный студент):

 /* 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. Спасибо. Это только для названия. Я должен сделать то же самое с датами. Верно? Не изучал Arraylist (только массивы), поэтому не могу полностью понять код. Извините

2. Точно, немного изменил мой ответ — добавил год. Кстати: Думайте объектно-ориентированным способом 🙂

Ответ №2:

Как насчет сохранения самих объектов Student в списке?

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

Кроме того, когда вы извлекаете информацию из сканера, назначьте эти фрагменты информации (например, имя, возраст и т.д.) временному объекту, чтобы вы могли выполнить для них некоторую проверку.

 String temp = sc.nextLine();
 

Проверьте «temp», и если это то, что вы хотите сохранить в имени пользователя, то вызовите setter из класса пользователя.

Всегда рекомендуется проверять вводимые пользователем данные перед вызовом любых методов установки для вашего объекта.

Ответ №3:

Похоже, что вы разделяете ответственность за сбор информации между кодом в вашем основном блоке и кодом в вашем Stundent (обратите внимание на орфографическую ошибку) классе.

Я бы сосредоточился на том, чтобы подумать о том, какова ответственность класса, и убедиться, что в классе нет дополнительного кода, который напрямую не обрабатывает ответственность этого класса. Например, если a Student должен сохранять свое имя, то поле name должно быть внутри Student (вы сделали это таким образом, и это имеет большой смысл). Однако, если имя учащегося должно быть обновлено, не имеет смысла запрашивать Student запрос с помощью println инструкции о том, что он ожидает имя после того, как вы присвоили ему одно имя.

Возможно, вам нужен StudentReader класс, который может считывать входные данные, а затем создавать Student объект. Такой читатель будет нести исключительную ответственность за выполнение всех правильных подсказок и считывание значений, при этом конечным результатом будет единая конструкция Student . Тогда основной блок в основном представлял бы собой цикл для чтения каждого учащегося с помощью a StudentReader и a section для сбора прочитанных Student файлов и их соответствующей обработки.