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

    } 
} 

我有一个程序,需要一个特定的任务在一个月的特定日子上运行。 任务运行后(或者如果不是那一天)线程会一直睡到明天再次检查。死代码警告

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

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

+3

只在特定时间运行的代码不是*死代码*。 –

+1

哪一行是死代码警告? – Ralph

+0

它在startTask(); – Craig

回答

5

但是,我得到一个死码警告,因为部分的代码是 只在当月的某个特定日期运行。

不,你得到一个死代码警告becase的startTask();从未运行。 Calendar.DATECalendar类值5的内部指标定要获得该月的当前日期,使用此代码:Calendar.getInstance().get(Calendar.DAY_OF_MONTH)

+0

X不能是5吗? <!---------------------------> –

+0

@Jigar Joshi:在这种情况下,它可以是,但显然不是。在任何情况下比较都没有意义。 –

+0

多数民众赞成在完美,谢谢:) – Craig

0

转到为quartz和配置CronTrigger那会好得多

+1

我只是要评论相同。 :) –

+2

-1没问题。这是一个评论,而不是一个答案。虽然这是一个有用的评论。 – musiKk

7

你能告诉我们什么X是什么?

if(Calendar.DATE == X) 

如果X是本月的一些常数,表示一天,这是行不通的,因为你与另一个常量X比较Calendar.DATE不变。让我猜猜,你的代码是一样的东西:

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。你会惊讶有多少错误可以用这样一个简单的代码(认为:服务器时区,夏令时......)

+2

为什么'新的GregorianCalendar()'而不是'Calendar.getInstance()'? –

+0

的确很棘手的问题。我想在一些奇怪的宇宙中,Calendar.getInstance()可能会返回一些不是'GregorianCalendar'的东西。这本身并不是一个问题*,但是如果这个其他日历系统没有*月份*(甚至是*月* *)的概念,那么您会遇到讨厌的运行时异常。 Java日期/日历抽象的几个缺陷之一。我没有记错吗? –

1

我相信死者是代码行 startTask();

如果编译器可以检测到这是无法访问的,那很可能是因为X(不管它是什么)永远不会取得与Calendar.DATE相同的值,它始终为5.这是“get和set的字段编号,指示当天的月份。“根据的Javadoc,而不是一个月的当天,您可以使用

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

你可能想看看的方式类似java.util.Timer得到的例子。

+0

这是完美的,谢谢! – Craig

+0

在我的timeUntilNextCheck()方法中,我创建两个日历(今天和明天),然后计算它们之间的差异。这是好的做法还是java定时器要走的路? – Craig

+0

使用java.util.Timer(或Quartz等更复杂的东西),您可以创建一个将在特定时间运行的任务,而不会减少日期。 Java标准库中的日历和相关类使用起来非常尴尬,所以Joda-Time通常是首选。 – Ben