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