2014-01-22 4 views
2

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

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 

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

ответ

2

Чтобы прочитать цифры или String s, я бы рекомендовал вам использовать 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 читать String с, с помощью метода nextLine().

Edit:

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

int i = System.in.read(); 
System.out.println(Integer.parseInt(Character.toString(((char) i)))); 
+0

ok спасибо, да, это сработало. Но я хотел бы знать, почему choice = System.in.read(); не сработал. Почему он принимал неправильный ввод. – thinkingmonster

+0

Вы хотите знать, почему работает «Сканер»? Или почему 'System.in.read()' не работает? – Christian

+0

Оба, пожалуйста, дайте мне знать ... – thinkingmonster

1

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

Javadoc прочитанных():

/** 
* 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. 
* 
+0

+1 это правильный ответ. OP должен использовать сканер, как говорит @Christian, и читает ввод как int. – HpTerm

0

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

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

@Christian's scanner suggestion очень хорошо. Я думаю, вы должны это сделать.

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

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