Как работает этот try-catch?

#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.

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