Java Parse Exception to Custom Exception

Я новичок в Java, и моя проблема здесь - простой калькулятор возраста. Вот мой код:

public class Client {
public int findAge(String birthDate) throws InvalidDateFormatException {
//  InvalidDateFormatException is a custom defined

    int age = 0;
    try {
        Calendar past = new GregorianCalendar();
        Calendar present = Calendar.getInstance();
        past.setTime(new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH).parse(birthDate));
        age = present.get(Calendar.YEAR) - past.get(Calendar.YEAR); 
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}
    return (age >= 0) ? age : 0;
}

В основном,

try {
                System.out.println(c.findAge("08-09-1015"));
            } catch (InvalidDateFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Теперь это вызывает исключение ParseException каждый раз, когда я передаю строку в неправильном формате. Есть ли способ, с помощью которого я могу вместо этого выдать исключение InvalidDateFormatException?

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

2 ответа

Решение

Чтобы ответить на ваш главный вопрос, вам нужно добавить специальное исключение в поле catch блок:

try {
    Calendar past = new GregorianCalendar();
    Calendar present = Calendar.getInstance();
    past.setTime(new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH).parse(birthDate));
    age = present.get(Calendar.YEAR) - past.get(Calendar.YEAR); 
} catch (ParseException e) {
    throw new InvalidDateFormatException("invalid date: " + birthDate);
}

Что касается вашего кода, у меня есть несколько предложений:

  • Не использовать new GregorianCalendar() и предпочитаю Calendar.getInstance(),
  • То, как вы вычисляете возраст, нарушено: вы не учитываете месяц и день (скажем, у нас 2015-09-20, а дата рождения - 2014-12-01, ваш код выведет 1, даже если ребенку еще нет 1 года).
  • Попробуйте указать аргумент Date вместо аргумента String. Это не должно быть обязанностью findAge способ разобрать дату рождения.
  • Если вы используете Java 8, рассмотрите возможность использования нового API времени Java.

Определите класс пользовательских исключений для InvalidDateFormatException, как показано ниже:

public class InvalidDateFormatException extends RuntimeException {

    private String errorMessage;

    public InvalidDateFormatException(String errorMessage, Exception exe) {
        super(errorMessage);
        exe.printStackTrace();
    }
}

Измените ваш блок catch, чтобы выдать исключение, как показано ниже:

public class Client {
public int findAge(String birthDate) throws InvalidDateFormatException {
    int age = 0;
    try {
        Calendar past = new GregorianCalendar();
        Calendar present = Calendar.getInstance();
        past.setTime(new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH).parse(birthDate));
        age = present.get(Calendar.YEAR) - past.get(Calendar.YEAR);
    } catch (ParseException e) {
        throw new InvalidDateFormatException("Invalid Date Format while finding Age", e);
    }
    return (age >= 0) ? age : 0;
 }
}

Кроме того, я бы посоветовал вам перейти на следующий сайт: https://docs.oracle.com/javase/tutorial/essential/exceptions/creating.html

Другие вопросы по тегам