#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
файлов и их соответствующей обработки.