Сканер пропускает ввод в цикл for
Итак, у меня есть этот код:
public class Subjects {
String name;
int period;
char grade;
public void period()
{
System.out.println("I have " + this.name + " during period " + this.period + ".");
}
public void study()
{
if (this.grade == 'B')
{
System.out.println("I study for " + this.name + ", so I get a B!");
}
else if (this.grade == 'A')
{
System.out.println("I study for " + this.name + ", so I get an A!");
}
else
{
System.out.println("I don't study for " + this.name + ", so I get a " + this.grade +". :(");
}
}
}
И этот тестовый класс:
import java.util.Scanner;
public class SubjectsTest {
public static void main (String [] args)
{
Scanner kboard = new Scanner(System.in);
Subjects[] classes;
System.out.print ("How many classes do you have? ");
int x = kboard.nextInt();
int y;
classes = new Subjects[x];
for (int b = 0; b < x; b++)
{
classes[b] = new Subjects();
}
for (int a = 0; a < x; a++)
{
y = a + 1;
System.out.println("Period " + y );
System.out.println ("Enter the subject name: ");
classes[a].name = kboard.nextLine();
System.out.println ("Enter your class period: ");
classes[a].period = kboard.nextInt();
System.out.println ("Enter your grade in the class: ");
classes[a].grade = kboard.next().charAt(0);
}
for (int i = 0; i < x; i++)
{
classes[i].period();
classes[i].study();
}
}
}
Что должно произойти, это то, что пользователь вводит количество классов, которые у него есть (например, 8), а затем вводит имя, период и их оценку для каждого. Затем в конце он печатает 2 оператора для каждого класса.
Однако, когда я запускаю программу (в Eclipse), после этого спрашивает How many classes do you have?
и пользователь отвечает, система распечатывает следующие два вопроса, не ожидая ответа на первый. Мое сообщение об ошибке выглядит так:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at SubjectsTest.main(SubjectsTest.java:27)
Почему это делает это? Как я могу это исправить? Я новичок в Java, поэтому любая помощь будет высоко ценится!
1 ответ
Вы должны положить kboard.nextLine();
после вашего kboard.nextInt();
вызов, который получает количество классов.
Это будет читать в остальной части kboard.nextInt();
линии и разрешить чтение в вашем названии темы, чтобы работать должным образом. В настоящее время ваш kboard.nextLine();
читать в названии темы читает в оставшейся части вашего ввода для числа классов. Поэтому, когда вы пытаетесь читать в теме, это на самом деле ждет int
на срок и дает вам это исключение.
РЕДАКТИРОВАТЬ: Извините за все правки, принятый ответ на этот вопрос может иметь немного больше смысла: Использование scanner.nextLine()