Обработка ошибок для SimpleDateFormat в Java - PullRequest
0 голосов
/ 26 ноября 2018

Я пишу программу, которая принимает пользовательский ввод в течение нескольких часов и минут в формате ЧЧ: ММ и возвращает строку этого ввода.Например, 13:56 будет "четыре минуты до двух".

Я создал код, чтобы сделать именно это - взять ввод в этом формате и вернуть значение, как указано выше.Моя проблема в том, что я не уверен, как обрабатывать ошибки.У меня есть цикл while, который предназначен для отлова ошибок, но это не так.В основном я хочу убедиться, что если пользователь вводит символьный ввод (например, rb или 12: bb и т. Д.) Или неверное время (14:68 (я иду на 12-часовых часах)), программа сообщает «Ошибка!»и заставляет пользователя повторить попытку.

Я работал с обработкой исключений, но не сделал этого для SimpleDateFormat, и я не могу понять, почему ниже не работает.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Попробуйте это:

public static void main(String[] args) {
    boolean safetyNet = false;
    Scanner in = new Scanner(System.in);
    Date d = new Date();
    SimpleDateFormat simpFormat = new SimpleDateFormat("hh:mm");

    while (!safetyNet) {
        System.out.println("Please enter the time in hours and minutes: ");
        String timeToString = in.next();
        try {
            d = simpFormat.parse(timeToString);
            safetyNet = true;
            String sHours = timeToString.substring(0, 2);
            String sMinutes = timeToString.substring(3);
            int hours = Integer.parseInt(sHours);
            int minutes = Integer.parseInt(sMinutes);
            String time=getTimeName(hours, minutes);
            if(time.isEmpty()){
                safetyNet = false;
            }else{
                System.out.printf("Time is: " + getTimeName(hours, minutes));
            }   
        } catch (ParseException e) {
            System.out.println("Error! Try again: ");
            // e.printStackTrace();
        }
    }
    in.close();
}

public static String getTimeName(int hours, int minutes) {
    String timeName = "";

    if (hours >= 1 && hours <= 12 && minutes >= 0 && minutes <= 59) {
        String hourBank[] = { "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
                "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen",
                "Nineteen", "Twenty", "Twenty one", "Twenty two", "Twenty three", "Twenty four", "Twenty five",
                "Twenty six", "Twenty seven", "Twenty eight", "Twenty nine" };

        if (minutes == 0) {
            timeName = hourBank[hours] + " O'clock";
        }

        else if (minutes == 15) {
            timeName = "A quarter past " + hourBank[hours];
        }

        else if (minutes == 30) {
            timeName = "Half Past " + hourBank[hours];
        }

        else if (hours == 12 && minutes == 45) {
            timeName = "A quarter to " + hourBank[hours - 11];
        }

        else if (minutes == 45) {
            timeName = "A quarter to " + hourBank[hours + 1];
        }

        else if (minutes <= 29) {
            timeName = hourBank[minutes] + " minutes past " + hourBank[hours];
        }

        else if (hours == 12 && minutes >= 31 && minutes <= 59) {
            timeName = hourBank[60 - minutes] + " minutes to " + hourBank[hours - 11];
        }

        else if (minutes >= 31 && minutes <= 60) {
            timeName = hourBank[60 - minutes] + " minutes to " + hourBank[hours + 1];
        } else {
            timeName = "That's not the correct format!";
        }

    }else{
        System.out.println("minutes are between 0 and 60 and hours are between 0 and 12");
    }
    return timeName;
}
0 голосов
/ 26 ноября 2018

Учитывая, что вы просто ожидаете простую строку hh:mm, я мог бы использовать String#matches здесь:

do {
    timeToString = in.nextLine();
} while (!timeToString.matches("(1[0-2]|0[1-9]):[0-5]\\d"));

Этот цикл будет повторяться до тех пор, пока пользователь не введет действительную строку 12-часового часа: минуты,Если вам не нравится этот подход, другой подход будет использовать SimpleDateFormat#parse, чтобы попытаться проанализировать ввод.Этот метод выдает ParseException, так что вы можете попробовать перехватить и зациклить его.

...