public void uncaughtException(Thread t, Throwable e) {
if (parent != null) {
parent.uncaughtException(t, e);
} else {
Thread.UncaughtExceptionHandler ueh =
Thread.getDefaultUncaughtExceptionHandler();
if (ueh != null) {
ueh.uncaughtException(t, e);
} else if (!(e instanceof ThreadDeath)) {
System.err.print("Exception in thread “”
- t.getName() + “” ");
e.printStackTrace(System.err);
}
}
}
然后调用 Thread.getDefaultUncaughtExceptionHandler() 获取默认的 UncaughtExceptionHandler ,然后调用 uncaughtException 方法,既然名字是默认的 uncaughtExceptionHandler 对象,那么必然有初始化的地方,这就需要从系统初始化开始说起,不过初始化流程特别复杂,也不是本篇重点,所以就直接从 RuntimeInit 的 main 方法开始吧。
public static final void main(String[] argv) {
enableDdms();
if (argv.length == 2 && argv[1].equals(“application”)) {
if (DEBUG) Slog.d(TAG, “RuntimeInit: Starting application”);
redirectLogStreams();
} else {
if (DEBUG) Slog.d(TAG, “RuntimeInit: Starting tool”);
}
commonInit();
/*
-
Now that we’re running in interpreted code, call back into native code
-
to run the system.
*/
nativeFinishInit();
if (DEBUG) Slog.d(TAG, “Leaving RuntimeInit!”);
}
作为 java 类, main 方法一直都是执行的入口。从上述代码可以看出, main 方法中会调用 commonInit 方法:
protected static final void commonInit() {
if (DEBUG) Slog.d(TAG, “Entered RuntimeInit!”);
/*
-
set handlers; these apply to all threads in the VM. Apps can replace
-
the default handler, but not the pre handler.
*/
LoggingHandler loggingHandler