死码警告

Cra*_*aig 0 java scheduling date dead-code

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tom*_*icz 7

你能告诉我们什么X是?

if(Calendar.DATE == X)
Run Code Online (Sandbox Code Playgroud)

如果X某个常量代表一个月中的某一天,那么这将不起作用,因为您将Calendar.DATE 常量与另一个常量进行比较X.让我猜,你的代码是这样的:

if(Calendar.DATE == 17)  //run on 17th of every month
Run Code Online (Sandbox Code Playgroud)

这意味着:

if(5 == 17)  //I see dead code
Run Code Online (Sandbox Code Playgroud)

编译器会给你一个提示,即永远不会满足这个条件(并且可能不会编译if语句体).

相反,你应该测试:

if(new GregorianCalendar().get(Calendar.DATE) == 17)
Run Code Online (Sandbox Code Playgroud)

或者甚至更好地使用Quartz.您会惊讶地发现,使用如此简单的代码可以犯很多错误(想想:服务器时区,夏令时......)

  • 为什么`新的GregorianCalendar()`而不是`Calendar.getInstance()`? (2认同)

Mic*_*rdt 5

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

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