Переключатель: ввод остался в консоли (я задавал эти вопросы несколько раз, но, кажется, никто не знает, почему) - PullRequest
0 голосов
/ 11 сентября 2018

enter image description here

Пожалуйста, позвольте мне сначала в устной форме описать проблему.

Проблема в том, что вы видите на консоли.

Кодирование выполняется с помощью сканера и оператора switch.

  1. Он спрашивает пользователя, кому вы хотите дать часть MP. (макс. MP каждого персонажа составляет 30)
  2. Я хотел протестировать и попробовал 2,3,2,4 входных данных, чтобы увидеть, что он скажет, и, как вы могли видеть, он говорит: «MP у Jongwoo полон. Выберите другого персонажа ...» и так же для всех другие персонажи, как и ожидалось, за исключением Кёнгсока, чей MP в настоящее время равен 15. Так что, когда я ввожу 1 (для Кёнсока), он говорит, что MP Кёнгсока исцелен, и внезапно остальной персонаж делает то же самое. (пожалуйста, не обращайте внимания на количество зажившего, мне нужно это исправить)

Одна вещь, которую я понял, заключалась в том, что они были напечатаны в порядке, указанном для проверки номеров: 2, 3, 2, 4. Таким образом, ввод, оставшийся в консоли, стал вводом, и оператор switch принимает его как ввод.

Я не знаю, почему это так. У меня много операторов switch, и это не единственный оператор switch, имеющий эту проблему. и следующий код является кодом для оператора switch.

    public static void chooseMMCha1(Character member) {
    boolean wrongAnswer;
    do {
        wrongAnswer = false;
        Scanner sc = new Scanner(System.in);
        while(!sc.hasNextInt()) {
            sc.next();
        }

    switch (sc.nextInt())  {
    case 1:
        chooseMMCha(chosenMember[0], member);
        break;
    case 2:
        chooseMMCha(chosenMember[1], member);
        break;
    case 3:
        chooseMMCha(chosenMember[2], member);
        break;
    case 4:
        chooseMMCha(chosenMember[3], member);
        break;
    case 5:
        chooseMMCha(chosenMember[4], member);
        break;
    case 6:
        turn(member);
        break;

    default:
        System.out.println("From 1 to 6");
        wrongAnswer = true;
        break;

    }
    }while(wrongAnswer);
}

1 Ответ

0 голосов
/ 11 сентября 2018

Похоже, у вас есть непреднамеренная рекурсия.

В вашем chooseMMCha1() методе вы вызываете chooseMMCha(). Затем этот метод проверяет, является ли выбор допустимым. Если это не так, он снова вызывает chooseMMCha1().

Однако, как только вы введете правильный ввод, вызов chooseMMCha1() выйдет из стека и вернется к вашему вызову chooseMMCha(). Как только он возвращается сюда, вы распечатываете, что персонаж был исцелен. Таким образом, как только вы введете действительный ввод, все недействительные входы, которые вы поместили в стек, разрешатся, и ваш метод распечатает, что они были исцелены.

В случае недопустимого ввода вам нужно поставить оператор return; после вызова chooseMMCha1(), чтобы убедиться, что вы не продолжаете метод, когда недопустимые входные данные выходят из стека:

if(chosenMember.getMP() == chosenMember.getMaxMP()) {
    System.out.println(chosenMember +"'s MP is already full");
    chooseMMCha1(member);
    return; //Exit the method
}
...