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

    }
}

月の特定の日に特定のタスクを実行する必要があるプログラムがあります。タスクが実行された後(またはその日でない場合)、スレッドは明日までスリープし、そこで再度チェックされます。

ただし、コードの一部がその月の特定の日にのみ実行されるため、デッドコードの警告が表示されます。

この警告が何であるかを読んだところ、コンパイラがデッドコードをコンパイルしない場合があることがわかりました。だから私の質問は、これは常にコンパイルされるのでしょうか?

4

4 に答える 4

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を使用することをお勧めします。このような単純なコードで多くの間違いを犯す可能性があることに驚かれることでしょう(サーバーのタイムゾーン、夏時間などを考えてみてください)。

于 2011-09-21T09:58:35.763 に答える
5

ただし、コードの一部がその月の特定の日にのみ実行されるため、デッドコードの警告が表示されます。

いいえ、デッドコード警告startTask();が表示されます。これは実行されないためです。Calendar.DATEは、値5のクラスの内部インデックス定数ですCalendar。月の現在の日を取得するには、次のコードを使用します。Calendar.getInstance().get(Calendar.DAY_OF_MONTH)

于 2011-09-21T09:58:49.833 に答える
1

デッドコードはstartTask()の行だと思います。

コンパイラがこれに到達できないことを検出できる場合は、X(それが何であれ)Calendar.DATEが常に5であると同じ値をとることができないためである可能性があります。これは「月の日を示すgetおよびsetのフィールド番号」です。Javadocによると、月の現在の日ではなく、たとえば次を使用して取得できます。

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

ちなみに、のようなものを見たいと思うかもしれませんjava.util.Timer

于 2011-09-21T10:03:38.527 に答える
0

クォーツを選び、はるかに優れたCronTriggerを構成します

于 2011-09-21T09:57:29.570 に答える