ThreadGroupのuncaughtExceptionメソッド
2007/02/13
java
javadoc1.4には、
このスレッドグループ内のスレッドが、キャッチされていない例外のために停止すると、Java 仮想マシンによって呼び出されます。とあります。
........
アプリケーションは、ThreadGroup のサブクラスでこのメソッドをオーバーライドして、キャッチされていない例外を別の方法で処理することができます。
キャッチしていない例外を処理したい。
という場合に使えそうです。
簡単なサンプルコードです。
public class TestUncaughtException {
public static void main(String[] args) {
class MyThreadGroup extends ThreadGroup{
public MyThreadGroup(String name) {
super(name);
}
public void uncaughtException(Thread t, Throwable e) {
System.out.println("oh my god!!");
}
}
Thread thread = new Thread(new MyThreadGroup("test"), new Runnable(){
public void run() {
a();
}}
);
thread.start();
}
public static void a() {
a2();
}
public static void a2() {
a3();
}
public static void a3() {
if (true)
throw new RuntimeException("@_@!! Ouch");
}
}
public static void main(String[] args) {
class MyThreadGroup extends ThreadGroup{
public MyThreadGroup(String name) {
super(name);
}
public void uncaughtException(Thread t, Throwable e) {
System.out.println("oh my god!!");
}
}
Thread thread = new Thread(new MyThreadGroup("test"), new Runnable(){
public void run() {
a();
}}
);
thread.start();
}
public static void a() {
a2();
}
public static void a2() {
a3();
}
public static void a3() {
if (true)
throw new RuntimeException("@_@!! Ouch");
}
}
サンプルコードを実行しますと、
実行時例外のスタックトレースが出力されるかわりに、oh my god!!が出力されます。
使うための仕組みを考えるのが面倒かなと思いました。
: