правильный способ чтения пользовательского ввода из командной строки в java

Я надеялся получить некоторые мнения о передовых методах работы и комментарии о том, как я читаю вводимые пользователем данные из командной строки. Есть ли рекомендуемый способ сделать это, правильно ли я использую блоки try / catch?

Мой пример здесь работает нормально, но все же хотелось бы услышать, есть ли более «чистый» способ сделать это. Большое спасибо. Например, нужны ли ему операторы return в каждом блоке catch? Или мне следует поместить свою логику (условные выражения) в блок try?

public class Client {

public static void main(String[] args) {
    begin();
}

private static void begin(){
    Machine aMachine = new Machine();
    String select=null;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while(aMachine.stillRunning()){
        try {
            select = br.readLine();
        } catch (IOException ioe) {
            System.out.println("IO error trying to read your selection");
            return;
        }catch(Exception ex){
            System.out.println("Error trying to evaluate your input");
            return;
        }

        if (Pattern.matches("[rqRQ1-6]", select)) {
            aMachine.getCommand(select.toUpperCase()).execute(aMachine);
        }
        /*
         * Ignore blank input lines and simply
         * redisplay options
         */
        else if(select.trim().isEmpty()){
            aMachine.getStatus();
        }
        else {                
            System.out.println(aMachine.badCommand()+select);
            aMachine.getStatus();
        }
    }
}

}


person denchr    schedule 15.11.2009    source источник


Ответы (1)


Я обычно предпочитаю использовать класс Scanner для чтения из строки ввода. С помощью класса сканера вы можете запрашивать определенные типы (double, int, ..., string). Это также поможет вам провести валидационное тестирование.

Я бы не рекомендовал писать синтаксический анализ ввода так, как вы. Перехват общего исключения приведет к перехвату чего угодно, от MemoryError и т. Д. Придерживайтесь определенных исключений и обрабатывайте их оттуда. Сканер выполнит исключение InvalidInputException (или что-то подобное), если входные данные не соответствуют ожидаемому типу.

person monksy    schedule 15.11.2009
comment
Значит, сканер не требует использования блоков try / catch и обработки исключений? - person denchr; 15.11.2009
comment
Это не требует этого, но это приведет к неправильному вводу. - person monksy; 15.11.2009