while(true){
try
{
if(Calendar.DATE == X){
startTask();
}
long delay = timeUntilNextCheck();
Thread.sleep(delay);
}
catch (Throwable t)
{
}
}
我有一个程序需要在一个月的特定日期运行特定任务。 在任务运行之后(或者如果它不是那天),线程会一直睡到明天它将再次检查。
但是,我收到了死代码警告,因为部分代码仅在该月的特定日期运行。
我已经阅读了这个警告是什么,我发现在某些情况下编译器不会编译死代码。所以我的问题是,这总是会被编译吗?
答案 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.DATE
是Calendar
类的内部索引常量,值为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