Проблемы с циклом do-while

Я только новичок в кодировании java, я просто писал простую программу: пользователю предоставляется меню, в котором он должен ввести число от 1 до 4, если пользователь вводит правильный номер, требуемая задача выполняется, если введен неправильный номер, пользователя снова спрашивают для ввода. Ниже моя программа

class menu {
  public static void main(String [] args) throws java.io.IOException {
        int choice;
        do
        {
            System.out.println("HELP MENU: ");
            System.out.println("IF STATEMENT: 1 ");
            System.out.println("WHILE: 2 ");
            System.out.println("DO WHILE: 3 ");
            System.out.println("SWITCH: 4 ");
            choice = System.in.read();
            System.out.println(choice);
        }

        while( choice < 1 || choice > 4);
        System.out.println("\n");
        System.out.println(choice);

        switch (choice)
        {
        case 1:
            System.out.println("if statement is selected");
            break;
        case 2:
            System.out.println("while statement is selected");
            break;

        case 3:
            System.out.println("do while statement is selected");
            break;

        case 4:
            System.out.println("switch statement is selected");
            break;
        }
    }
}

ВЫВОД: +++++++

E:\study\javacode>java menu 
HELP MENU:
IF STATEMENT: 1
WHILE: 2
DO WHILE: 3
SWITCH: 4
4
52
HELP MENU:
IF STATEMENT: 1
WHILE: 2
DO WHILE: 3
SWITCH: 4
13
HELP MENU:
IF STATEMENT: 1
WHILE: 2
DO WHILE: 3
SWITCH: 4
10
HELP MENU:
IF STATEMENT: 1
WHILE: 2
DO WHILE: 3
SWITCH: 4

что бы пользователь ни вводил с клавиатуры, код продолжает повторяться через цикл do-while. я определил причину, распечатав входное значение, и я обнаружил, что входное значение ошибочно принимается кодом. Пожалуйста, помогите решить эту проблему.


person thinkingmonster    schedule 22.01.2014    source источник


Ответы (3)


Чтобы читать числа или Strings, я бы порекомендовал вам использовать объект Scanner. Создайте и инстанцируйте его в начале main():

Scanner in = new Scanner(System.in);

и вызовите метод nextInt() в do-while:

do {
    System.out.println("HELP MENU: ");
    System.out.println("IF STATEMENT: 1 ");
    System.out.println("WHILE: 2 ");
    System.out.println("DO WHILE: 3 ");
    System.out.println("SWITCH: 4 ");
    choice = in.nextInt();
    System.out.println(choice);
} while (choice < 1 || choice > 4);

Примечания:

  • System.in.read() на самом деле возвращает значение int введенного вами символа. Например, если вы введете 1, метод вернет 49, что равно (int)'1'.
  • Как я упоминал ранее, вы можете использовать Scanner для чтения Strings с помощью метода nextLine().

Изменить:

Просто чтобы убедиться, что вы можете использовать _ 16_ (вы должны прочитать документацию, чтобы понять, что она делает), чтобы прочитать целое число, попробуйте это (в отдельном файле, чтобы случайно не изменить свой код):

int i = System.in.read();
System.out.println(Integer.parseInt(Character.toString(((char) i))));
person Christian    schedule 22.01.2014
comment
хорошо, спасибо, да, это сработало. Но я хотел бы знать, почему выбор = System.in.read (); не сработало.Почему он вводил неправильный ввод. - person thinkingmonster; 22.01.2014
comment
Вы хотите знать, почему Scanner работает? Или почему System.in.read() не работает? - person Christian; 22.01.2014
comment
Как сказал @Njol в своем ответе, он читает байт данных, а возвращаемое значение - int между [0, 255]. Scanner обеспечивает большую гибкость, поскольку у него есть методы для чтения различных типов nextLine(), nextInt(), nextDouble, _6 _... - person Christian; 22.01.2014

Проблема в том, что вы используете InputStream.read (), который считывает из потока байт, а не символ, например если вы наберете «1», read () вернет 0x31.

Документ Javadoc из read ():

/**
 * Reads the next byte of data from the input stream. The value byte is
 * returned as an <code>int</code> in the range <code>0</code> to
 * <code>255</code>. If no byte is available because the end of the stream
 * has been reached, the value <code>-1</code> is returned. This method
 * blocks until input data is available, the end of the stream is detected,
 * or an exception is thrown.
 *
person Njol    schedule 22.01.2014
comment
+1 это правильный ответ. OP должен использовать сканер, как говорит @Christian, и читать ввод как int. - person HpTerm; 22.01.2014

System.in.read() работает не совсем так, как вы думаете. Он считывает символ (не int) и возвращает байтовое значение, а не целое число.

Когда пользователь вводит «1», read() возвращает 49, что является целочисленным байтовым значением для символа «1». (50 - это 2, 51 - 3 и т. Д.).

@ Предложение сканера Кристиана очень хорошее. Я думаю, тебе стоит сделать это вместо этого.

В качестве альтернативы вы можете изменить оператор switch, чтобы использовать 49/50/51 / и т. Д., Но это некрасиво.

person Grant Birchmeier    schedule 22.01.2014