Каковы подробные характеристики использования Static или Dynamic Frameworks для улучшения времени запуска?

Проблема заключалась в том, что вы не продвинули Scanner мимо проблематичного ввода. Из документа hasNextInt() :

Возвращает true, если следующий токен в этом входе сканера может быть интерпретирован как значение int в базовом значении по умолчанию, используя nextInt().

Это относится ко всем методам hasNextXXX(): они возвращают true или false, не продвигая Scanner.

Вот фрагмент, иллюстрирующий проблему:

    String input = "1 2 3 oops 4 5 6";
    Scanner sc = new Scanner(input);
    while (sc.hasNext()) {
        if (sc.hasNextInt()) {
            int num = sc.nextInt();
            System.out.println("Got " + num);
        } else {
            System.out.println("int, please!");
            //sc.next(); // uncomment to fix!
        }
    }

Вы обнаружите, что эта программа перейдет в бесконечный цикл, повторно задав int, please!.

Если вы раскомментируйте оператор sc.next(), затем он Scanner пройдет мимо маркера, который не работает hasNextInt(). Затем программа будет печатать:

Got 1
Got 2
Got 3
int, please!
Got 4
Got 5
Got 6

Тот факт, что сбой hasNextXXX() не пропускает вход, преднамерен: он позволяет выполнять дополнительные проверки этого токена, если это необходимо. Вот пример, иллюстрирующий:

    String input = " 1 true foo 2 false bar 3 ";
    Scanner sc = new Scanner(input);
    while (sc.hasNext()) {
        if (sc.hasNextInt()) {
            System.out.println("(int) " + sc.nextInt());
        } else if (sc.hasNextBoolean()) {
            System.out.println("(boolean) " + sc.nextBoolean());
        } else {
            System.out.println(sc.next());
        }
    }

Если вы запустите эту программу, вы получите следующее:

(int) 1
(boolean) true
foo
(int) 2
(boolean) false
bar
(int) 3

0
задан kgaidis 18 January 2019 в 15:48
поделиться