8月18日每日一题:为什么JAVA中异常只会引发当前线程停止,但是安卓中却会进程停止运行?

失落夏天
优质创作者: 操作系统技术领域
领域专家: 算法与数据结构技术领域
2022-08-18 14:09:16

问:为什么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);
            }
        }

所以安卓中,崩溃会导致进程被杀死是安卓做自己控制的逻辑。

 

 

 

...全文
217 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-Java 发布问题, 以便更快地解决您的疑问

15

社区成员

发帖
与我相关
我的任务
社区描述
打造一个安卓技术讨论的社区
androidflutterandroidx 个人社区 上海·长宁区
社区管理员
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧