2011-09-21 137 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