Измените свой подход, чтобы создать код, который обрабатывает каждую строку изолированно. Предполагая, что одну строку данных можно поместить в объект типа Student, вы должны сделать что-то вроде:
private List<Student> students = new ArrayList<>();
for (int i = 0; i < maxLineCount; i++) {
String line = scanner.nextLine();
students.add(processLine(line));
}
public Student processLine(String line) {
// code here to create a data object from each line
// using either String#split(..)
// or using a separate Scanner created for each line and then disposed
return new Student(....); // create your data object from the processed line
}
Обратите внимание, что число конечных чисел может варьироваться, и поэтому вам нужно будет использовать некоторое время l oop, используя от while (someScanner.hasNextInt())
до l oop, при использовании сканера
Например:
public Student processLine(String line) {
Scanner lineScanner = new Scanner(line);
String name = lineScanner.next();
String email = lineScanner.next();
String id = lineScanner.next();
List<Integer> values = new ArrayList<>();
while(lineScanner.hasNextInt()) {
values.add(lineScanner.nextInt());
}
lineScanner.dispose(); // done with the line scanner
// using data collected above create my data or Student?
return new Student(...);
}
Отдельная проблема: не передавайте сканер в конструктор Student, так как не следует смешивать логические классы, такие как Student, и код вашего пользовательского интерфейса (пользовательского интерфейса). Вместо этого предоставьте Студенту конструктор, который принимает данные, которые имеют смысл - имя, адрес электронной почты, идентификатор, .... и собирайте данные в разделе пользовательского интерфейса вашей программы, создавая объекты Student по мере сбора данных.