Предупреждение о мертвом коде - PullRequest
0 голосов
/ 21 сентября 2011
while(true){
    try 
    {
        if(Calendar.DATE == X){
            startTask();
        } 
        long delay = timeUntilNextCheck();
        Thread.sleep(delay);
    } 
    catch (Throwable t) 
    {

    }
}

У меня есть программа, которая требует выполнения определенной задачи в определенный день месяца. После запуска задачи (или, если это не тот день) поток спит до завтра, где он будет проверять снова.

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

Я прочитал, что это за предупреждение, и обнаружил, что в некоторых случаях компилятор не компилирует мертвый код. Так что мой вопрос, это всегда будет компилироваться?

Ответы [ 4 ]

7 голосов
/ 21 сентября 2011

Можете ли вы сказать нам, что такое X?

if(Calendar.DATE == X)

Если X - это некоторая константа, представляющая день месяца, это не сработает, поскольку вы сравниваете Calendar.DATE константа с другой константой X.Позвольте мне предположить, что ваш код выглядит примерно так:

if(Calendar.DATE == 17)  //run on 17th of every month

, что означает:

if(5 == 17)  //I see dead code

Компилятор дает вам подсказку, что это условие никогда не будет выполнено (и может не беспокоить компиляциюif тело оператора).

Вместо этого вы должны проверить:

if(new GregorianCalendar().get(Calendar.DATE) == 17)

Или еще лучше использовать Кварц .Вы будете удивлены, сколько ошибок вы можете сделать с таким простым кодом (подумайте: часовой пояс сервера, летнее время ...)

5 голосов
/ 21 сентября 2011

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

Нет, вы получаете предупреждение о мертвом коде, потому что startTask(); не будет никогда работать. Calendar.DATE является внутренней индексной константой класса Calendar со значением 5. Чтобы получить текущий день месяца, используйте этот код: Calendar.getInstance().get(Calendar.DAY_OF_MONTH)

1 голос
/ 21 сентября 2011

Полагаю, что мертвый код - это строка startTask ();

Если компилятор может обнаружить, что это недоступно, это возможно потому, что X (каким бы он ни был) никогда не сможет принять то же значение, что и Calendar.DATE, который всегда равен 5. Это «номер поля для получения и установки с указанием дня месяца».согласно Javadoc, а не текущему дню месяца, который вы можете получить, например, используя

Calendar.getInstance().get(Calendar.DATE)

Кстати, вы можете посмотреть на что-то вроде java.util.Timer.

0 голосов
/ 21 сентября 2011

Выберите кварц и настройте CronTrigger, который будет намного лучше

...