2016-11-07 5 views
1

Мои методы read() разбиваются каждый раз, когда я ввожу строку или Char. Как я могу заставить его принимать только целые значения. Когда я вхожу в int, он работает нормально, но когда я вхожу в Char или String, я получаю повторяющийся «Введите день открытия учетной записи: null». Я должен завершить программу, чтобы остановить ее.Как остановить пользователя от ввода строки в этом методе read()?

private void readDay(Scanner keyboardIn) { 
    boolean success = false; 
    while (!success) { 
     try { 
      System.out.print("Enter the day the account opened: "); 
      int d = keyboardIn.nextInt(); 
      dateOpened.setDay(d); 
      success = true; 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

// Enter the month, checking for error 
private void readMonth(Scanner keyboardIn) { 
    boolean success = false; 
    while (!success) { 
     { 
      try { 
       System.out.print("Enter the month the account opened: "); 
       int m = keyboardIn.nextInt(); 
       dateOpened.setMonth(m); 
       success = true; 
      } catch (Exception e) { 
       System.out.println(e.getMessage()); 
      } 
     } 
    } 
} 


// Enter the year, checking for error 
private void readYear(Scanner keyboardIn) { 
    boolean success = false; 
    while (!success) { 
     try { 
      System.out.print("Enter the year the account opened: "); 
      int y = keyboardIn.nextInt(); 
      dateOpened.setYear(y); 
      success = true; 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

ответ

5

Вы не можете запретить пользователю вводить не номера; вам просто нужно справиться с этим, когда они это сделают.

Вместо того, чтобы пытаться читать числа, читать строку, в цикле:

  • Если ввести номер, разобрать его как целое, используйте номер, и остановить цикл.
  • Если они вводят что-то еще, распечатайте сообщение и продолжайте цикл.

Что-то вроде этого:

while (true) { 
    String line = keyboardIn.nextLine(); 
    if (line.matches("\\d+")) { 
    int d = Integer.parseInt(line); 
    dateOpened.setDay(d); 
    break; 
    } 

    System.out.println("Must be an integer; try again."); 
} 
1

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

if (input.hasNextInt()) { 
    int number = input.nextInt() ; 
    System.out.println(number); 
    //your code 
} else { 
    System.out.println("Sorry please enter a number!"); 
} 

Для получения дополнительной информации смотрите здесь:
1. How do I keep a Scanner from throwing exceptions when the wrong type is entered?
2. How to use Scanner to accept only valid int as input

+1

Может ли кто-нибудь объяснить нижний предел? –

+0

Пробовал ли вы код, который вы написали, с нечисловым вводом? –

+0

Это не работает, поскольку значение non-int не потребляется. – kgeorgiy

0

В этом предложении «Введите день счет открытия: нуль», слово null исходит из вашего раздела catch, e.getMessage. Если вы хотите, чтобы пользователи вводили номер, когда они вводят неправильный тип.

Вам нужно снова инициализировать переменную в части try. Демо-код, как показано ниже, я уже тестировал, он работает нормально.

import java.util.Scanner; 

public class Question01 { 

    public static void main(String[] args) { 

     // new Scanner(System.in) 
     boolean success = false; 
     Object d = null; 
     while (!success) { 
      try { 

       System.out.print("Enter the day the account opened: "); 
       Scanner keyboardIn = new Scanner(System.in); 
       d = keyboardIn.nextInt(); 

       System.out.println(d); 

       success = true; 
      } catch (Exception e) { 

       System.out.println("Error"); 
       // keyboardIn.close(); 
      } 
     } 

    } 
} 
+0

Как включить свой код в мой метод. – Daniel

+0

Мне нужно сохранить e.getMessage() в блоке catch в качестве вызова сообщения об ошибке из класса Date, чтобы указать, что диапазон недопустим. например: от 1-31 до 1-12. и т. д. – Daniel

+0

Вы можете сохранить e.getMessage() в коде, это не повлияет на существующую функцию. Для подробного требования проверки дневного или месячного формата, я считаю, что они определены в вашем объекте «dateOpened», мне тяжело комментировать больше, так как я не вижу его. – lpcclown

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