2013-03-29 2 views
1

Привет Я бегу этот код:Java Exception неправильно печать

public static int chooseOption() { 
    int choice = 0; 
    System.out.println("Enter number [1, 2, 3..]"); 

    do { 
     try { 
      choice = sc.nextInt(); 
     } catch (java.util.InputMismatchException e) { 
      System.out.println(e); 
      break; 
     } 
    } while(choice == 0 || choice < 0); 


    return choice; 
} 


public static String chooseCom() { 
    String choice = new String(); 
    int commNumber = 0; 

    System.out.println("Choose your COM port"); 
    commNumber = chooseOption(); 

    choice = "COM" + commNumber; 
    System.out.println(choice); 
    return choice; 
} 

после этого я называю ->

Helper.chooseOption(); 

Helper.chooseCom(); 

и когда я пишу по первому зову 1.1 или просто неправильно поплавка (двойной) значение выхода:

Enter number [1, 2, 3..] 
1.1 
java.util.InputMismatchException 
Choose your COM port 
Enter number [1, 2, 3..] 
java.util.InputMismatchException 
COM0 

Второй java.util.Input .. это проблема почему он внезапный, когда я написал неправильный номер только по первому зову?

+0

Что такое 'sc'? Где он определен, и что в нем? –

+0

Пожалуйста, напишите больше кода, который вы используете, поскольку здесь, похоже, недостаточно, чтобы дать производный ответ. – david99world

+1

@JohnKugelman выглядит как 'java.util.Scanner' –

ответ

3

При вводе ввода, который не соответствует ожидаемому, nextInt не потребляет вход. From the documentation:

Когда сканер выдает InputMismatchException, сканер не будет передавать маркер, который вызвал исключение, так что он может быть извлечен или пропущен через какой-либо другой способ.

Раствор пропускает через недопустимого ввода в броской пункте, например, с nextLine:

try { 
     choice = sc.nextInt(); 
    } catch (java.util.InputMismatchException e) { 
     System.out.println(e); 
     sc.nextLine(); // skip the entire line 
     break; 
    } 
3

Предполагая, что sc является java.util.Scanner ...

Классовые Сканер работ (концептуально) разбивая входные данные на токены, а затем обрабатывая токены. Если вы вызываете sc.nextInt(), когда следующий токен не соответствует синтаксису для целого числа, вызов выдает это исключение.

Однако, если метод nextXxx выдает исключение, он не «потребляет» следующий токен. Вместо этого он оставляет его в потоке токенов сканера ... поэтому, когда вы снова вызываете sc.nextInt(), он попытается снова проанализировать один и тот же токен и выбросить одно и то же исключение.

Чтобы отменить токен, вам необходимо позвонить sc.next(). Или, если вы хотите сбросить всю строку, вызовите sc.nextLine().

+0

Я понимаю это да, благодаря большому количеству исправил его :) – Stuci