0
while(true){
    try 
    {
        if(Calendar.DATE == X){
            startTask();
        } 
        long delay = timeUntilNextCheck();
        Thread.sleep(delay);
    } 
    catch (Throwable t) 
    {

    }
}

我有一个程序需要在一个月中的特定日期运行特定任务。任务运行后(或者如果不是那天),线程会一直休眠到明天再次检查。

但是,我收到了死代码警告,因为部分代码仅在每月的特定日期运行。

我阅读了这个警告是什么,我发现在某些情况下编译器不会编译死代码。所以我的问题是,这会一直编译吗?

4

4 回答 4

7

你能告诉我们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)

甚至更好地使用Quartz。您会惊讶于使用如此简单的代码会犯多少错误(想想:服务器时区,夏令时......)

于 2011-09-21T09:58:35.763 回答
5

但是,我收到了死代码警告,因为部分代码仅在每月的特定日期运行。

不,你会收到一个死代码警告,因为它startTask();永远不会运行。Calendar.DATECalendar类的内部索引常量,值为 5。要获取当前日期,请使用以下代码:Calendar.getInstance().get(Calendar.DAY_OF_MONTH)

于 2011-09-21T09:58:49.833 回答
1

我认为死代码是行 startTask();

如果编译器可以检测到这是不可达的,那可能是因为 X(无论它是什么)永远不能取与 相同的值Calendar.DATE,它总是 5。这是“用于获取和设置的字段编号,指示月份中的哪一天”。根据Javadoc,而不是当月的当天,例如您可以使用

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

顺便说一下,您可能想看看类似java.util.Timer的东西。

于 2011-09-21T10:03:38.527 回答
0

选择石英并配置 CronTrigger 会好得多

于 2011-09-21T09:57:29.570 回答