#java
#java
Вопрос:
Код Java, который я читаю,:
private void validateCoordinatorJob() throws Exception {
// check if startTime < endTime
if (!coordJob.getStartTime().before(coordJob.getEndTime())) {
throw new IllegalArgumentException("Coordinator Start Time must be earlier than End Time.");
}
try {
// Check if a coord job with cron frequency will materialize actions
int freq = Integer.parseInt(coordJob.getFrequency());
// Check if the frequency is faster than 5 min if enabled
if (ConfigurationService.getBoolean(CONF_CHECK_MAX_FREQUENCY)) {
CoordinatorJob.Timeunit unit = coordJob.getTimeUnit();
if (freq == 0 || (freq < 5 amp;amp; unit == CoordinatorJob.Timeunit.MINUTE)) {
throw new IllegalArgumentException("Coordinator job with frequency [" freq
"] minutes is faster than allowed maximum of 5 minutes ("
CONF_CHECK_MAX_FREQUENCY " is set to true)");
}
}
} catch (NumberFormatException e) {
Date start = coordJob.getStartTime();
Calendar cal = Calendar.getInstance();
cal.setTime(start);
cal.add(Calendar.MINUTE, -1);
start = cal.getTime();
Date nextTime = CoordCommandUtils.getNextValidActionTimeForCronFrequency(start, coordJob);
if (nextTime == null) {
throw new IllegalArgumentException("Invalid coordinator cron frequency: " coordJob.getFrequency());
}
if (!nextTime.before(coordJob.getEndTime())) {
throw new IllegalArgumentException("Coordinator job with frequency '"
coordJob.getFrequency() "' materializes no actions between start and end time.");
}
}
}
Чего я не понимаю "Coordinator job with frequency [" freq "] minutes is faster than allowed maximum of 5 minutes (" CONF_CHECK_MAX_FREQUENCY " is set to true)"
, так это того, можно ли распечатать журнал.
Насколько я знаю, когда if (freq == 0 || (freq < 5 amp;amp; unit == CoordinatorJob.Timeunit.MINUTE))
условие выполняется, и программа выдает исключение IllegalArgumentException. Генерируемое исключение будет перехвачено catch (NumberFormatException e)
и обработано в этом блоке как e
.
Но это e
никогда не используется впоследствии.
Поэтому мне интересно, возможно ли распечатать Coordinator job with frequency ...
журнал.
Для меня, похоже, нет разницы между исходным кодом и простым помещением блока catch в if (freq == 0 || (freq < 5 amp;amp; unit == CoordinatorJob.Timeunit.MINUTE))
оператор, как показано ниже:
private void validateCoordinatorJob() throws Exception {
// check if startTime < endTime
if (!coordJob.getStartTime().before(coordJob.getEndTime())) {
throw new IllegalArgumentException("Coordinator Start Time must be earlier than End Time.");
}
// Check if a coord job with cron frequency will materialize actions
int freq = Integer.parseInt(coordJob.getFrequency());
// Check if the frequency is faster than 5 min if enabled
if (ConfigurationService.getBoolean(CONF_CHECK_MAX_FREQUENCY)) {
CoordinatorJob.Timeunit unit = coordJob.getTimeUnit();
if (freq == 0 || (freq < 5 amp;amp; unit == CoordinatorJob.Timeunit.MINUTE)) {
Date start = coordJob.getStartTime();
Calendar cal = Calendar.getInstance();
cal.setTime(start);
cal.add(Calendar.MINUTE, -1);
start = cal.getTime();
Date nextTime = CoordCommandUtils.getNextValidActionTimeForCronFrequency(start, coordJob);
if (nextTime == null) {
throw new IllegalArgumentException("Invalid coordinator cron frequency: " coordJob.getFrequency());
}
if (!nextTime.before(coordJob.getEndTime())) {
throw new IllegalArgumentException("Coordinator job with frequency '"
coordJob.getFrequency() "' materializes no actions between start and end time.");
}
}
}
}
Комментарии:
1. @maloomeister Оператор try также включает в себя оператор if, который выдает
IllegalArgumentException
то, о чем говорит OP, а не толькоInteger.parseInt()
оператор.2. Однако он не будет перехвачен по причине @Sweeper, указанной выше.
3. @Sweeper @DanielBarbarian Спасибо.
NumberFormatException
расширяетсяIllegalArgumentException
, поэтому я подумал, что это тоже сработаетIllegalArgumentException
. Тогда можно ли предположить, что часть catch записана для случаяparseInt
сбоя с недопустимымcoordJob.getFrequency()
значением?
Ответ №1:
Catch перехватывает a NumberFormatException
, а не an IllegalArgumentException
, поэтому он не будет перехватывать исключение, генерируемое в throw
операторе. Тот факт, что NumberFormatException
наследуется от IllegalArgumentException
, не имеет значения. catch
предложения перехватывают исключения вниз по дереву наследования, а не вверх. Если человек может поймать все Tennisball
s, и вы бросаете Ball
на них общее, они не поймают это, не так ли?
Предполагая, что другие методы в try
предложении не генерируют NumberFormatException
s, catch
предложение предназначено для перехвата NumberFormatException
брошенного by Integer.parseInt
.
Поэтому мне интересно, возможно ли распечатать задание координатора с частотой … log.
Он может быть напечатан другим методом, который улавливает исключение дальше по стеку вызовов.