1

次のようなコードがあります。

public static void startService() {
            try{
            new Thread(new Runnable() {
                @Override
                public void run() {
                    throw new RuntimeException("Some exception");
                }
            }).start();
            }catch (Exception e){
                //Exception handling
            }
        }

親スレッドの catch() ブロックでこの例外を処理するにはどうすればよいですか? UPD : このスレッドは非同期で動作する必要があります

4

5 に答える 5

2

スレッドによってスローされた例外を処理するには、いくつかのオプションがあります。1 つは、一般的なキャッチされない例外ハンドラーを用意することです。

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        //log the exception or handle it here if possible
    }
});

しかし、その方法でキャッチされた例外を特定のスレッドにリンクすることは困難です。

または、スレッドを手動で開始する代わりに ExecutorService を使用できます。

ExecutorService executor = Executors.newCachedThreadPool();
Future<?> future = executor.submit(new Runnable() {
    @Override
    public void run() {
        throw new RuntimeException("Some exception");
    }
});

try {
   future.get();
} catch (ExecutionException e) {
    Throwable yourException = e.getCause(); //here you can access the exception
}
于 2013-07-04T10:14:25.850 に答える
0

Runnable の run() メソッド内にあるということであれば、別のアプローチを使用する必要があります。代わりに Callable を使用してください。Callable call() メソッドを使用すると、値を返し、例外をスローできます。

Callableの使用例については、こちらをご覧ください。また、スレッドのライフサイクルを管理し、スレッド プーリングを提供する ExecutorService などの高レベルの API を使用することをお勧めします。(例に含まれています)

于 2013-07-04T10:15:38.620 に答える
0

Callable を使用する必要があります。

thread.run メソッドは、別のスレッドで実行されるため、例外をスローすることはありません。これは、呼び出し元のスレッドに干渉しません。

callable を (ExecutorService 経由で実行するなどして) 実行すると、Future の結果が返され、future.get() メソッドの呼び出し時に指定された例外がスローされます。

于 2013-07-04T10:19:54.493 に答える
-1

例外の再スローは、単にブロックに追加throw eするだけですcatch

于 2013-07-04T10:06:41.083 に答える
-1

catch ブロックで throw ステートメントを使用します。

public static void startService() {
        try{
        new Thread(new Runnable() {
            @Override
            public void run() {

            }
        }).start();
        }catch (Exception e){
            throw e;
    }
}
于 2013-07-04T10:07:02.393 に答える