1

30秒ごとに実行するようにスケジュールしたい非常に単純な Runnable があります-これはこの質問のための単純な例であり、実際にこれを使用する実際のポイントではないことに注意してください。

@Override
public void run() {
    System.out.println("Throwing an unchecked exception on purpose...");
    int abc = 123 - 123;
    int def = 123 / abc;
}

Timer と TimerTask を使用していましたが、問題が発生しました。TimerTask がチェックされていない例外を発生させると、そのタスクの後続の実行がキャンセルされます。したがって、上記のタスクは、未チェックの除算 0 例外をスローするため、実際には 1 回だけ実行されます。

私の知る限り、ScheduledThreadPoolExecutor には、少なくとも公式の Java API ドキュメント「タスクの実行で例外が発生した場合、後続の実行は抑制される」によると、まったく同じ「機能」があります。

チェックされていない例外が発生した場合に、Timer または ScheduledThreadPoolExecutor のいずれかを後続の実行を抑制しないようにする Java の標準的な方法はありますか?

どうもありがとう。

4

1 に答える 1

4

チェックされていない例外が発生した場合に、Timer または ScheduledThreadPoolExecutor が後続の実行を抑制しないようにする Java の標準的な方法はありますか?

非常に簡単な方法が1ExceptionSuppressingRunnableつあります。別のものをラップする を作成します。

public final class ExceptionSuppressingRunnable implements Runnable
{
    private final Runnable original;

    public ExceptionSuppressingRunnable(Runnable runnable)
    {
        // TODO: Null validation
    }

    public void run()
    {
        try
        {
            original.run();
        }
        catch (RuntimeException e)
        {
            // TODO: Logging
        }
    }
}

これは意図的にキャッチしないことに注意してくださいError(または、Throwable の他の非 Exception サブクラス)。代わりにキャッチできます-コードが宣言せずにチェック済み例外をスローした奇妙なケースでのみ違いが生じます(バイトコードの書き換え、バージョン管理の違いなどにより)。キャッチするだけの方がおそらくわかりやすいと思います。ExceptionRuntimeExceptionRuntimeException

于 2012-08-03T16:43:00.030 に答える