2014-01-04 5 views
2

Это сложный вопрос для исследования, поэтому, пожалуйста, простите меня, если это дубликат.В то время как цикл выполняется один раз перед запросом

В принципе, у меня есть цикл while, который будет только разорваться, если код, который пользователь сканирует, является целым числом. Я проверяю это, пытаясь Integer.parseInt(integer) и только разбивает цикл, если исключение NumberFormatException не выбрасывается.

Моя проблема заключается в том, что когда цикл выполняется в первый раз, исключение вызывается без ввода пользователем.

Вот мой код:

Scanner input = new Scanner(System.in); 

while (true) 
{ 
    System.out.print("Please scan barcode: "); 
    int inCode = 0; 

    try 
    { 
     inCode = Integer.parseInt(input.next()); 
    } 
    catch (NumberFormatException e) 
    { 
     System.out.println("Numbers only, please."); 
    } 

    if (inCode != 0) { 
    // Do Stuff 
    } else { 
    System.out.println("Code can't be zero!"); 
    } 
} 

Что должно случиться, это:

Отсканируйте штрих-код: // And here they enter the barcode

Но вместо того, чтобы это произошло:

Сканируйте штрих-код: только номера, пожалуйста.
Отсканируйте штрих-код:

EDIT:

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

Scanner input = new Scanner(System.in); 

while (true) 
{ 
     System.out.print("Please scan barcode: "); 
     int inCode = 0; 

     try 
     { 
      inCode = Integer.parseInt(input.next()); 
     } 
     catch (NumberFormatException e) 
     { 
      System.out.println("Numbers only, please."); 
      continue; 
     } 

     if (true) // Here it checks if an account associated with the code entered exists in the database. Because I'm having issues when it creates a new account, I've made this true. 
     { 
      System.out.println("No account associated with that code! Create one?"); 
      System.out.print("(yes/no): "); 
      String answer = input.next(); 
      if (answer.equalsIgnoreCase("yes")) 
      { 
       System.out.println("Alright."); 
       System.out.print("Please enter a name: "); 
       String name = input.next(); 
       System.out.print("Alright. Now I'll add that to the database... "); 

       // Here I add that to the database. Omitted. 

       System.out.println("Done! Please scan again to interface."); 
      } 
      else if (answer.equalsIgnoreCase("no")) 
      { 
       System.out.println("Okay then."); 
      } 
      else 
      { 
       System.out.println("Defaulting to no."); 
      } 
     } 
} 
// I still haven't written the code to interface with the account. 

Что происходит сейчас, он говорит (в первой итерации)

Отсканируйте штрих-код:

Но, пройдя через процесс добавления учетной записи, то петли снова и говорит:

Сканируйте штрих-код: только номера.
Отсканируйте штрих-код:

EDIT:

Пожалуйста, обратите внимание, что все находится внутри while цикла, так что, когда все, что пользователь сделал закончена, она будет возвращаться к:

Отсканируйте штрих-код:

+3

Что перед этим кодом? –

+0

Какой выход System.out.println (inCode) дает вам после части try-catch при первом запуске цикла while? – user3116916

+1

Как намекнул Сотириос, очень вероятно, что проблема не в этом фрагменте. Можете ли вы опубликовать ВСЕ код, а не только ту часть, где вы думаете, что проблема? –

ответ

2

Я думаю, что вам хочу это:

Scanner input = new Scanner(System.in); 
while (true) { 

    System.out.print("Please scan barcode: "); 
    int inCode = 0; 

    try { 
     inCode = Integer.parseInt(input.next()); 
     if (inCode != 0) { 
      // Do Stuff 
      break; 
     } 
    } catch (NumberFormatException e) { 
     System.out.println("Numbers only, please."); 
    } 
} 
+1

Я думаю, что не рекомендуется создавать новый сканер на каждой итерации. – Bear

+0

И, честно говоря, нет смысла использовать 'Scanner.next()' здесь, когда вход является 'int'. Кроме того, это не * действительно * отвечает на вопрос; он уже * имеет * a «Сканер». –

1

код, который вы могли бы быть структурирована лучше, что бы и сделать его более ясным, что происходит и легче отследить проблемы. Вы хотите только петли на входных данных - так просто петлю на входе данных:

int inCode = 0; 
while (true) { 
    System.out.print("Please scan barcode: "); 

    try { 
     inCode = Integer.parseInt(input.next()); 
     break; 
    } catch (NumberFormatException e) { 
     System.out.println("Numbers only, please."); 
    } 
} 

// Do stuff 

Вы должны рассмотреть возможность использования scanner.hasNextInt() и scanner.nextInt(), а не scanner.next() хотя. Это также позволит избежать необходимости использовать исключение, подобное этому. Обычно использование Исключения для управления потоком программы - плохая идея - действительно, они должны использоваться для обработки исключительных обстоятельств. Integer.parseInt не дает вам никаких альтернатив, но сканер.

+0

um, это приведет к разрыву цикла с любым входом, и нет смысла использовать 'next()', когда ожидается, что вход будет int. –

+1

? Если исключение выбрано из 'parseInt' break; никогда не было достигнуто ... –

0

Я бы просто continue петля, если есть плохой вход, то вам не нужно, чтобы проверить это позже:

while (true) { 
    System.out.print("Please scan barcode: "); 
    int inCode = 0; 

    try { 
     inCode = Integer.parseInt(input.next()); 
    } catch (NumberFormatException e) { 
     System.out.println("Numbers only, please."); 
     continue; // ADDED THIS LINE 
    } 

    // Do Stuff with inCode 
} 

Обратите внимание, что при тестировании кода для нуля после ввода, вы исключаете нулевой действительным вход. Этот код позволяет любое число, включая ноль. Маленькая точка, но нет никаких проблем с краевыми случаями.

0

Вы можете попробовать это

String in=null; 
while (true) { 
    System.out.print("Please scan barcode: "); 
    int inCode = 0; 
    try { 
     in= input.next(); 
     inCode=Integer.parseInt(in); 
    } catch (NumberFormatException e) { 
     System.out.println("Numbers only, please."); 
    } 

if (inCode != 0) { 
// Do Stuff 
} else { 
// Repeat loop 
} 

или вы можете сразу прочитать целое через объект Scanner вместо использования Integer.parseInt() метода.

int inCode=0; 
while(true) { 
    System.out.print("Please scan barcode : "); 
    inCode=input.nextInt(); 

    if(inCode!=0){ //do stuff } 
    else { //Repeat Loop } 
} 
+0

Я попытался использовать nextInt, и это иллюстрирует суть моей проблемы: 'Пожалуйста, сканируйте штрих-код: Исключение в потоке" main "java.util.InputMismatchException' Что-то вводится в объект Scanner до того, как пользователь даже касается сканера штрих-кода. Что дает? – blerch

1

После редактирования, это ясно, что проблема: ваш while (true) цикл не имеет break заявления, в нем, так что он будет держать зацикливание.

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

int inCode; 
while (true) { 
    System.out.print("Please scan barcode: "); 
    try { 
     inCode = Integer.parseInt(input.next()); 
     if (inCode == 0) { 
      System.out.println("Code can't be zero!"); 
     } else { 
      break; // we got a valid barcode! end the loop and move on... 
     } 
    } catch (NumberFormatException e) { 
     System.out.println("Numbers only, please."); 
     // no need for a "continue" here, since the loop will restart anyway 
    } 
} 

// rest of the code here... 

или, возможно, даже:

int inCode; 
while (true) { 
    System.out.print("Please scan barcode: "); 
    try { 
     inCode = Integer.parseInt(input.next()); 
    } catch (NumberFormatException e) { 
     System.out.println("Numbers only, please."); 
     continue; 
    } 
    if (inCode == 0) { 
     System.out.println("Code can't be zero!"); 
     continue; 
    } 
    break; // we have a valid barcode! end the loop and move on... 
} 

// rest of the code here... 
+0

Предполагается, что он зациклится навсегда. Точка его в цикле 'while' такова, что он вернется к началу (' Пожалуйста, сканируйте штрих-код: '), когда пользователь закончит сопряжение. – blerch

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