死码警告

时间:2011-09-21 09:54:35

标签: java date scheduling dead-code

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

    }
}

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

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

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

4 个答案:

答案 0 :(得分: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。您会惊讶地发现,使用如此简单的代码可以犯很多错误(想想:服务器时区,夏令时......)

答案 1 :(得分:5)

  

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

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

答案 2 :(得分:1)

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

如果编译器可以检测到这是无法访问的,那可能是因为X(无论它是什么)永远不会采用与Calendar.DATE相同的值,它总是为5.这是“获取和设置的字段数”表示该月的某一天。“根据Javadoc,而不是当月的当天,例如你可以使用

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

顺便说一句,您可能希望查看java.util.Timer之类的内容。

答案 3 :(得分:0)

转到quartz并配置更好的CronTrigger