2014-01-17 7 views
1

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

Это просто что-то основное, но если я введу письмо, например, и после этого числа 1, например, он вернет случай 1 дважды?

Это мой код для всего класса до сих пор:

import java.util.InputMismatchException; 
import java.util.Scanner; 

public class Test { 

private int option; 

public static void main(String[] args) { 
    Test t = new Test(); 
    t.start(); 
    t.optionMenu(); 
} 

public void start() { 
    System.out.println("Make your choice:"); 
    System.out.println("1: Play"); 
    System.out.println("2: Options"); 
    System.out.println("3: Exit"); 

} 

public void optionMenu() { 
    try { 
     Scanner sc = new Scanner(System.in); 
     this.option = sc.nextInt(); 
     System.out.println(this.option); 
    } catch (InputMismatchException e) { 
     System.out.println("Please enter a number"); 
     optionMenu(); 
    } 


    switch (this.option) { 
     case 1: 
      System.out.println("Game starting..."); 
      break; 
     case 2: 
      System.out.println("Loading options"); 
      break; 
     case 3: 
      System.out.println("Game exiting..."); 
      System.exit(0); 
      break; 
     default: 
      System.out.println("Enter a valid number (1, 2 or 3"); 
      break; 
    } 
} 
} 

Любая помощь будет высоко ценится, спасибо!

+1

Вам нужно какое-то заявление вокруг инструкции switch. Просто продолжайте цикл до тех пор, пока вы не получите действительный ввод (т. Е. 1, 2 или 3). –

+0

Цикл должен находиться вокруг блока catch try, который держит его сканер, если что-либо, а не оператор switch. – Drifter64

ответ

1

Когда вы вызываете sc.nextInt() без предварительного запроса if (sc.hasNextInt()), вы можете обнаружить какое-то странное поведение, когда конечные пользователи начинают вводить неожиданный ввод, например буквы. В этом случае сканер не будет продвигать указатель чтения, поэтому ваша программа застрянет, прочитав тот же неправильный вывод.

Чтобы устранить эту проблему, добавьте цикл, который «очищает» недействительные записи, прежде чем пытаться прочитать int снова, как это:

while (!sc.hasNextInt()) { 
    System.out.print("You need to enter an integer."); 
    sc.nextLine(); // Clear out the bad input 
} 
int val = sc.nextInt(); // At this point we know that sc.hasNextInt(), because that's the loop condition 

Другое дело, что это не очень хорошая идея, чтобы сделать с рекурсией, что можно сделать с итерацией: рекурсивный вызов optionsMenu собирается накапливать столько уровней вызова, сколько количества времени, в течение которого конечный пользователь вводит неверное значение, поэтому очень постоянный пользователь теоретически может привести к переполнению стека на вашем путем повторного ввода неверных данных.

Использование приведенного выше фрагмента кода освободит вас от необходимости рекурсивно вызывать optionsMenu, а также извлечения исключения для ввода.

1

Это просто что-то основное, но если я введу письмо, например, и после этого числа 1, например, он вернет случай 1 дважды?

Я не уверен, что вы имеете в виду здесь. Во-первых, ваша идея работает, этот код должен быть в порядке!

Во-вторых, если вы вводите что-либо, кроме числа 1, 2 или 3, вы перейдете в блок кода «default:». Поскольку вы снова запрашиваете пользователя, если они терпят неудачу, набрав «a» или «a1» в приглашении, вы снова увидите меню. Пользователю нужно просто ввести «1», «2» или «3», чтобы успешно выбрать опцию меню.

+0

Например: Если вы нажмете «f», вы снова получите приглашение с меню, если вы затем нажмете действительный номер, он будет печатать в 2 раза больше, чем вы выбрали (кроме 2, в котором есть выход). – Glenndisimo

+0

Я не уверен, почему вы это видите. У него есть перерыв в каждом случае, поэтому он будет печатать только что-нибудь для его выбора один раз, независимо от того, пользователь вводит «1», «2» или «3». – Drifter64

Смежные вопросы