Статьи

NetBeans в классе: консольный ввод с использованием сканеров


колледже Доусон в Монреале, Канада. Он также является программным консультантом и по совместительству преподавателем в Школе расширенного обучения при Институте вычислительной техники Университета Конкордия . Он ведет блог на omniprogrammer.com и пишет в Твиттере @omniprof . Его регулярные колонки о NetBeans в образовании перечислены здесь .

Я достаточно стар, чтобы помнить коммерческие приложения с консольным интерфейсом. Мои ученики не имеют опыта работы с консолью. Когда появилась Java, эра таких приложений закончилась. Вместо этого вы использовали AWT, затем Swing и теперь JavaFX. Для студента, начинающего программировать, эти графические структуры добавляют сложность, к которой они могут быть не готовы. Поэтому я начинаю свои занятия, используя консольный ввод и вывод.

Ввод можно разделить на две категории. Первое — это ценности. Примитивные типы, такие как int и double, являются типами значений. Как я объясняю, значение — это то, что вы можете выполнять как математические, так и логические операции. Второй это струны. Строка не имеет значения в математическом смысле. Вместо этого у него есть состояние. Поэтому его нельзя использовать в математическом выражении. Состояние можно сравнивать, и поэтому можно использовать строки в логических выражениях, таких как определение, являются ли две строки одинаковыми. Если вы упорядочиваете строки, вы также можете определить, является ли одна строка больше или меньше другой.

В Java нет консольных процедур ввода значений. Для Java все, что вы вводите, является строкой. Это означало, что в течение многих лет каждый автор учебника по Java предоставлял консольную подпрограмму ввода, которая могла преобразовывать строки в значения. Java 1.5 сделала все эти процедуры избыточными с введением класса Scanner. Теперь я могу обучать вводу без необходимости подробно описывать классы-обертки или NumberFormatException в стандартном подходе.

/**
 * Ask the user for their weight
 */
public void inputWeight() {
    Scanner sc = new Scanner(System.in);
    System.out.print("Please enter your weight: ");
    int weight = sc.nextInt();
    System.out.println("Weight = " + weight);
}

Существует проблема с этим кодом. Если пользователь вводит строку, которая не может быть преобразована, мы получаем исключение NumberFormatException, которое мы хотим избежать.

Сканер предлагает решение со своим hasNext. , методы. Эти методы определяют, может ли пользовательский ввод быть преобразован в целевое значение. Вы можете отклонить ввод и избежать исключения.

/**
 * Ask the user for their weight
 */
public void inputWeight() {
    Scanner sc = new Scanner(System.in);
    System.out.print("Please enter your weight: ");
    int weight;
    // Accept input and test to see if it’s an integer
    if (sc.hasNextInt()) {
       // Success, it was an integer so get it
       weight = sc.nextInt();
       System.out.println("Weight = " + weight);
    } else {
        // Failure so retrieve the input as a String
        String bad = sc.next();
        // Inform the user what went wrong
        System.out.println(bad + " cannot be converted to an integer");
    }
}

Теперь, когда вы запускаете программу, вы получите следующее для хорошего ввода.

Это то, что вы получаете за плохой вклад.

Я вернусь к числовому вводу в другой статье, поскольку вы не хотите, чтобы программа заканчивалась, когда пользователь делает одну ошибку.

Ввод символов

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

Проблема в том, что в Scanner нет метода nextChar (). Вместо этого вам нужно использовать next (), который будет принимать все, что вы вводите.

public void displayMenu() {
    Scanner sc = new Scanner(System.in);
    System.out.println("Select an Account");
    System.out.println("A: Savings");
    System.out.println("B: Checking");
    System.out.println("C: Exit");
    System.out.print("Please choose A, B or C: ");
    String choice = sc.next();
    System.out.println("You chose: " + choice);
}

Что может привести к следующему:

Первое улучшение заключается в преобразовании строки в символ. Для этого строка должна быть длиной всего один символ. Вместо проверки длины вы можете просто извлечь первый символ в строке с помощью метода charAt класса String.

 String choice = sc.next();
char letter = choice.charAt(0);
System.out.println("You chose: " + letter);

Это сработает, и если вы введете «а», вы получите «а». Проблема сейчас в том, что регистр введенного вами символа не имеет значения. Это легко решить, добавив еще один метод из String в микс.

 char letter = choice.toUpperCase().charAt(0);

Почти идеально, но так как мы используем строковый ввод, пользователь может вводить любую строку, какую захочет. Таким образом, «бекон» приведет к «B». Нам также нужен какой-то способ контролировать допустимые буквы. В этом меню возможны варианты A, B и C.

Решение состоит в том, чтобы использовать метод hasNext для «next». Не нормальная, без параметров, но версия, которая принимает шаблон. Шаблон — это вежливый способ сказать регулярное выражение.

С
https://xkcd.com/208/

Как и в случае с целочисленным вводом, мы сначала проверяем строку, введенную пользователем. Регулярное выражение будет шаблоном, который будет использоваться для определения правильности строки. Это регулярное выражение, вероятно, самое простое, которое вы можете написать. Нам нужен один символ, либо в верхнем, либо в нижнем регистре, и это один из трех допустимых символов. Вот оно:

[ABCabc]

Квадратные скобки указывают, что это выражение класса символов, которое может соответствовать только одному символу. Внутри скобок указываются допустимые символы, в данном случае A, B, C, a, b или c. Поскольку эти символы находятся рядом в таблице ASCII / Unicode, их также можно записать в виде диапазона.

[A-Ca-c]

Собрав все это вместе, мы получим рутину, которая будет принимать только одно письмо.

public void displayMenu() {
    Scanner sc = new Scanner(System.in);
    System.out.println("Select an Account");
    System.out.println("A: Savings");
    System.out.println("B: Checking");
    System.out.println("C: Exit");
    System.out.print("Please choose A, B or C: ");
    char letter;
    if (sc.hasNext("[A-Ca-c]")) {
        String choice = sc.next();
        letter = choice.toUpperCase().charAt(0);
        System.out.println("You chose: " + letter);
    } else {
        String choice = sc.next();
        System.out.println(choice + " is not valid input");
    }
}

Теперь, если вы введете «a»:

Но если вы введете «aardvark»:

В моей следующей статье я немного подробнее рассмотрю ввод с консоли и познакомлю вас с тестом Бетховена.