2016-08-09 7 views
-4

Я новичок в Java (на самом деле только на третий день), но наслаждаюсь тем, что, когда дело доходит до изучения нового кода, я делал то же самое, изучая MATLAB как часть моей степени. По сути, мне нравится идти на один шаг дальше, чем каждый урок пытается учить.Java: как проверить вход пользователя?

В настоящее время я пишу базовый калькулятор, который может добавлять, вычитать, умножать и делить два числа и правильно работать с этим основным элементом. Мой «один шаг вперед» в этом случае состоял в том, чтобы повторить программу с возможностью выхода через пользовательский ввод и предотвратить любые ошибки из-за неверных пользовательских входов.

Я смог выполнить повторяющиеся и выходящие разделы этого небольшого проекта, но не смог предотвратить ошибки, вызванные недействительными вводами пользователя, а именно те, которые были вызваны строкой, введенной вместо желаемого Int или Double. Моя цель - предотвратить ошибку и вместо этого запросить допустимый ввод.

Из того, что я собрал, моя проблема может быть решена с помощью заявления Try/Catch, но я не знаю, как правильно реализовать такое утверждение. Мои лучшие попытки, следуя аналогичным примерам онлайн, были встречены неудачей, и я думаю, что это просто так, как я сам закодировал программу. Как я уже сказал, я новичок и использовал множество циклов While Loops для достижения желаемого поведения, и это, вероятно, ужасно неэффективный способ делать что-то.

Надеюсь кто-то может мне точку в правильном направлении,
Конор

Моя лучшая попытка до сих пор:

int InputValue; 
InputValue = 1; 
while (InputValue == 1) 
{ 
    try 
    { 
     System.out.print ("Enter First Number: "); 
     First = Input.nextDouble(); 
     InputValue = 0; 
    } 
    catch (NumberFormatException e) 
    { 
     System.out.println ("Invalid Input"); 
     System.out.println (" "); 
     System.out.print ("Enter First Number: "); 
     First = Input.nextDouble(); 
    } 
} 

Но, как было сказано выше, это, кажется, делает «Первый» невидимым для остальная часть моего кода с ошибкой:
«Локальная переменная Может быть, не была инициализирована»

Также пытался:

int InputValueX; 
InputValueX = 1; 
do 
{ 
    System.out.println (" "); 
    System.out.print ("Enter First Number: "); 
    while (!Input.hasNextDouble()) 
    { 
     System.out.println ("Invalid Input"); 
     Input.next(); 
    } 
    First = Input.nextDouble(); 
    InputValueX = 0; 
} 
while (InputValueX == 1); 

Это позволяет коду запускать, но не адресует неверную ошибку ввода.

И я не думаю, что я могу использовать логическое значение, как и то, что зацикливание всей мою программы (? Или вы можете использовать несколько Boolean Я попробовал и получил ошибку)

http://pastebin.com/TTuCNQbx
- Мою программу, чуть более 100 линий длиной
- Область интересов между ~ 45 и 85

+0

Есть тонны учебников там :) Пожалуйста, вернись, как только вы пробовали их, и если вы все еще застряли, и позвольте нам помочь вам тогда. Сначала используйте Google. –

+0

Возможный дубликат [Проверка ввода с использованием java.util.Scanner] (http://stackoverflow.com/questions/3059333/validating-input-using-java-util-scanner) – xenteros

+0

Я, очевидно, недостаточно объяснил в но я использовал Google и нашел несколько подобных примеров на этом форуме. Однако, когда я попытался выполнить аналогичный процесс с ними (используя Try/Catch), он эффективно нарушил любой код после этого раздела. Лучшим способом описать это было то, что я использовал Try/Catch для переменной «First», а затем любой код, следующий за этим Statement, не смог найти «First» –

ответ

0
boolean firstNumber = false; 
while (!firstNumber) { 
    try { 
     First = Input.nextDouble(); 
     firstNumber = true; 
    } catch (InputMismatchException e) { 
     firstNumber = false; 
     Input.nextLine(); 
    } 
} 

Это должно петлевой до аа соответствующий вход не был введен. Я бы порекомендовал добавить некоторый вывод System.out, чтобы пользователь знал, что его ввод недействителен, и как может выглядеть вкладка propper.

0

Фактически каждый пользовательский ввод String s. Затем вам необходимо подтвердить String, если это приемлемый формат для вас или нет.

Давайте предположим, что у вас уже есть вход пользователя хранится в String input:

String input; 
//some code for getting the input 
try { 
    double dbl = Double.parseDouble(input); 
} catch (NumberFormatException e) { 
    e.printStackTrace(); 
} 

Это общая конструкция для разбора String в double.Теперь вы можете обернуть его в цикл, который будет сканировать вход, пока вы не найдете то, что хотите. Не стесняйтесь использовать флаги, например.

boolean found = false; 
try { 
    double dbl = Double.parseDouble(input); 
    found = true; //this line won't be executed if parsing fails 
} catch (NumberFormatException e) { 
    e.printStackTrace(); 
    found = false; 
} 
+0

«found = false» в блоке catch не нужен, потому что найденный будет оставаться ложным, когда генерируется исключение, как вы сказали правильно :) –

+0

@progressive_overload Я знаю, но я разместил его там, если OP изменяет код – xenteros

0

Окружать такие строки, как Input.next * в вашем коде с помощью блока try/catch. Поймать RuntimeException или в частности InputMismatchException (лучшие практики), как показано ниже,

boolean Run = true; 
    while (Run) 
    { 
     Scanner input = new Scanner (System.in); 
     int i = 0; 
     try 
     { 
      i = input.nextInt(); 
     } 
     catch(InputMismatchException ime) 
     { 
      System.out.println("message to enter the input in valid format"); 
     } 
    } 
Смежные вопросы