while(true){
try
{
if(Calendar.DATE == X){
startTask();
}
long delay = timeUntilNextCheck();
Thread.sleep(delay);
}
catch (Throwable t)
{
}
}
我有一个程序,要求在每月的特定日期运行特定任务。任务运行后(或者如果不是当天(,线程将休眠到明天,它将再次检查。
但是,我收到死代码警告,因为部分代码仅在每月的特定日期运行。
我阅读了这个警告是什么,我发现在某些情况下编译器不会编译死代码。所以我的问题是,这总是被编译的吗?
你能告诉我们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)
甚至更好地使用石英。你会惊讶于这么简单的代码会犯多少错误(想想:服务器时区,夏令时......
但是,我收到死代码警告,因为部分代码是 仅在每月的特定日期运行。
不,您会收到一个死代码警告,以防startTask();
永远不会运行。 Calendar.DATE
是值为 5 的 Calendar
类的内部索引常量。若要获取当月的当前日期,请使用以下代码:Calendar.getInstance().get(Calendar.DAY_OF_MONTH)
我认为死代码是行 startTask((;
如果编译器可以检测到这是无法访问的,那可能是因为 X(无论它是什么(永远不能取与 Calendar.DATE
相同的值,它总是 5。根据Javadoc的说法,这是"用于获取和设置的字段编号,指示月份中的某一天",而不是月份中的当前日期,例如您可以使用
Calendar.getInstance().get(Calendar.DATE)
顺便说一下,你可能想看看类似java.util.Timer
的东西。
选择石英并配置CronTrigger,那会好得多