Компилятор пропускает String переменная = scanner.nextLine() - Java
public void dodawanieStudentow() {
int liczba = 1;
String student = "studentu";
int iloscStudentow = 0;
float srednia;
Scanner scanner = new Scanner(System.in);
System.out.print("Podaj ilosc studentow, ktorych chcesz utworzyc: ");
iloscStudentow = scanner.nextInt();
studenci = new String[iloscStudentow];
System.out.println("Dodawanie nowych studentow: ");
for (int i = 0; i < studenci.length; i++) {
System.out.println("Informacja o " + student + liczba + ": ");
System.out.print("Podaj nazwisko: ");
nazwisko = scanner.nextLine();
if (nazwisko.length() < 3)
throw new IllegalArgumentException("Nazwisko musi miec minimum 3 znaki");
try {
System.out.print("Podaj wiek: ");
wiek = scanner.nextInt();
if (wiek < 17 || wiek > 80)
throw new IllegalArgumentException("Podaj wiek w zakresie [17, 80]");
System.out.print("Podaj ocene1: ");
ocena1 = scanner.nextFloat();
if (ocena1 < 2 || ocena1 > 5)
throw new IllegalArgumentException("Ocena musi byc w zakresie [2, 5]");
System.out.print("Podaj ocene2: ");
ocena2 = scanner.nextFloat();
if (ocena1 < 2 || ocena1 > 5)
throw new IllegalArgumentException("Ocena musi byc w zakresie [2, 5]");
} catch (InputMismatchException exc) {
System.out.print("Podales literke, musisz podac liczbe");
}
srednia = srednia();
studenci[i] = "Dane o " + student + liczba + ": nazwisko: " + nazwisko + ", wiek: " + wiek + "" +
", ocena1: " + ocena1 + ", ocena2: " + ocena2 + ", srednia: " + srednia;
liczba++;
}
for (int i = 0; i < studenci.length; i++) {
System.out.println(studenci[i]);
}
}
Как я проверяю переменную nazwisko на длину в строчке
if (nazwisko.length() < 3)
throw new IllegalArgumentException("Nazwisko musi miec minimum 3 znaki");
То у меня выбивает эта ошибка, то есть мне даже компилятор не дает ввести данные в переменную
nazwisko в этой строчке nazwisko = scanner.nextLine();
Кто нибудь знает в чем проблема?
Ответы (1 шт):
Я понимаю, что проблемы со сканером тоже надо решать, но при этом не стоит забывать о самых фундаментальных принципах, используемых разработчиками: на чиная от ооп, заканчивая solid, grasp и итд. Вы нарушаете все, что только можно. Какой смысл в этом коде? От реальной разработки эта задача далека, а в качестве учебного примера ничему хорошему она не научит. И еще... Именуйте свои переменные нормально, это ультимативное требование для разработчика любого уровня. Попробуйте хотя бы так (остальной функционал пишите в другом классе):
import java.util.Scanner;
import java.util.function.Function;
import java.util.function.Predicate;
public class UserInputService {
private final static Scanner SCANNER = new Scanner(System.in);
public static Student[] input() {
Student[] studenci = new Student[input(Integer::valueOf, "Podaj ilosc studentow, ktorych chcesz utworzyc: ")];
System.out.println("Dodawanie nowych studentow: ");
for (int i = 0; i < studenci.length; i++) {
studenci[i] = new Student();
studenci[i].setNazwisko(input(s -> s, "Informacja o studentu " + i+1 + ": \r\nPodaj nazwisko: ",
var->var.length() < 3, "Nazwisko musi miec minimum 3 znaki"));
studenci[i].setWiek(input(Integer::valueOf, "Podaj wiek: ", var->var < 17 || var > 80, "Podaj wiek w zakresie [17, 80]"));
studenci[i].setOcena1(input(Float::valueOf, "Podaj ocene1: ", var->var < 2 || var > 5, "Ocena musi byc w zakresie [2, 5]"));
studenci[i].setOcena2(input(Float::valueOf, "Podaj ocene2: ", (var)->var < 2 || var > 5, "Ocena musi byc w zakresie [2, 5]"));
}
return studenci;
}
private static <T> T input(Function<String, T> function, String message) {
System.out.print(message);
try {
return function.apply(SCANNER.nextLine());
} catch (Exception e) {
return input(function, "Podales literke, musisz podac liczbe: ");
}
}
private static <T> T input(Function<String, T> function, String message, Predicate<T> predicate, String errorMessage) {
T result = input(function, message);
if (predicate.test(result)) throw new IllegalArgumentException(errorMessage);
return result;
}
}
class Student{
private String nazwisko;
private Integer wiek;
private Float ocena1;
private Float ocena2;
public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
public void setWiek(Integer wiek) {
this.wiek = wiek;
}
public void setOcena1(Float ocena1) {
this.ocena1 = ocena1;
}
public void setOcena2(Float ocena2) {
this.ocena2 = ocena2;
}
public String getNazwisko() {
return nazwisko;
}
public Integer getWiek() {
return wiek;
}
public Float getOcena1() {
return ocena1;
}
public Float getOcena2() {
return ocena2;
}
}