uncaughtException の処理は, スレッドが終了する際の JavaThread::exit() の中で実行される (See: here for details).
(JDK 1.5 以降の場合には) java.lang.Thread.dispatchUncaughtException() が呼び出され, 以下の優先度で処理される.
java.lang.Thread.setUncaughtExceptionHandler() で UncaughtExceptionHandler がセットされていた場合:
セットされている UncaughtExceptionHandler が呼び出される.
対象スレッドが, java.lang.ThreadGroup.uncaughtException() をオーバーライドした ThreadGroup に登録されていた場合:
その java.lang.ThreadGroup.uncaughtException() メソッドが呼び出される.
(なお, 登録されている ThreadGroup に親がいる場合は再帰的に調べる)
java.lang.Thread.setDefaultUncaughtExceptionHandler() でデフォルトの UncaughtExceptionHandler がセットされていた場合:
デフォルトの UncaughtExceptionHandler が呼び出される.
上記以外の場合:
適当なエラーメッセージとスタックトレースを出力するのみ.
JDK 1.4 以前の場合には java.lang.ThreadGroup.uncaughtException() が呼び出される.
(See: here for details) -> JavaThread::exit() -> JavaCalls::call_virtual() -> (See: here for details) -> java.lang.Thread.dispatchUncaughtException() -> java.lang.Thread.getUncaughtExceptionHandler() -> * UncaughtExceptionHandler がセットされていれば, それが返される. * そうでなければ ThreadGroup が返される. -> java.lang.Thread.UncaughtExceptionHandler.uncaughtException() -> * UncaughtExceptionHandler がセットされている場合には, このメソッドをオーバーライドしたクラスが登録されているはずなので, ここでユーザー指定の挙動が行われる. * UncaughtExceptionHandler をセットされておらず ThreadGroup が返された場合には, java.lang.ThreadGroup.uncaughtException() にフォールバックする.
(See: here for details) -> JavaThread::exit() -> JavaCalls::call_virtual() -> (See: here for details) -> java.lang.ThreadGroup.uncaughtException() -> * このメソッドをオーバーライドした ThreadGroup が登録されている場合には, それが呼び出される. * オーバーライドされていない場合, 以下のデフォルトの java.lang.ThreadGroup.uncaughtException() の挙動にフォールバック. -> java.lang.Thread.getDefaultUncaughtExceptionHandler() -> java.lang.Thread.UncaughtExceptionHandler.uncaughtException()
(#Under Construction) See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.