15
社区成员
发帖
与我相关
我的任务
分享问:为什么JAVA中异常只会引发当前线程停止,但是安卓中却会进程停止运行?
答:这个是安卓的独特设置。默认情况下,线程中的未捕获异常,只会导致当前线程停止。
其原因就在于java的异常捕获机制:
java中的所有未捕获异常都会反馈到Thread中的dispatchUncaughtException这个方法中,这个方法中先查看当前线程是否存在异常处理handler(uncaughtExceptionPreHandler),如果存在则交给uncaughtExceptionPreHandler处理,
如果不存在,则检查uncaughtExceptionHandler是否存在,
如果还不存在,则交给ThreadGroup来处理,调用ThreadGroup中的uncaughtException方法。
ThreadGroup中,又会去检查Thread中的defaultUncaughtExceptionHandler是否存在:
// null unless explicitly set
private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;
要注意,这是一个静态成员变量,所以所有的线程都共用一份。
安卓中,在APP的进程fork后,会调用handleSystemServerProcess方法进行各种系统服务的初始化,这其中就包括运行时环境的初始化方法:
RuntimeInit.commonInit();
这个方法中,会去主动设置一个defaultUncaughtExceptionHandler:
Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler));
所以说,APP中的所有未捕获的异常,都会反馈到KillApplicationHandler中,我们在看一下这个handler中的uncaughtException方法:
@Override
public void uncaughtException(Thread t, Throwable e) {
try {
ensureLogging(t, e);
//向AMS上报崩溃
ActivityManager.getService().handleApplicationCrash(
mApplicationObject, new ApplicationErrorReport.ParcelableCrashInfo(e));
} catch (Throwable t2) {
...
} finally {
//重点看这里,会杀死当前进程
Process.killProcess(Process.myPid());
System.exit(10);
}
}
所以安卓中,崩溃会导致进程被杀死是安卓做自己控制的逻辑。