You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Android中子线程异常会致应用崩溃,而纯Java程序不会?

Android子线程抛出异常导致崩溃 vs 纯Java程序主线程继续运行的原因

问题重现

Android场景代码(Kotlin)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    Thread {
        throw java.lang.RuntimeException()
    }.start()
}

此代码会导致应用触发FATAL ERROR并直接崩溃。

纯Java程序场景代码

public class ThreadTest {
    public static void main(String args[]) {
        System.out.println("Start ");

        new Thread(){
            public void run() {
                System.out.println("Inner Start");
                throw new RuntimeException();
            }
        }.start();
        try{
            Thread.sleep(3000);
            System.out.println("End");
        }catch(Exception ignored){ }
    }
}

程序输出:

Start 
Inner Start
Exception in thread "Thread-0" java.lang.RuntimeException
    at ThreadTest$1.run(ThreadTest.java:17)
End

核心原因

两者的差异根源在于未捕获异常处理器(UncaughtExceptionHandler)的实现逻辑不同:

  • 纯Java SE程序:
    默认的未捕获异常处理器在子线程抛出未捕获异常时,仅打印异常栈轨迹到控制台,随后终止该异常线程,但不会干扰其他线程(包括主线程)的运行。主线程会继续执行自身任务,不受异常线程影响。

  • Android应用:
    Android系统为应用进程设置了全局未捕获异常处理器(RuntimeInit.UncaughtHandler)。当任意线程抛出未捕获异常时,这个处理器会:

    1. 收集异常信息、设备状态等调试数据
    2. 触发应用崩溃流程,终止整个应用进程
    3. 弹出系统崩溃提示对话框

这是因为Android应用以单进程模型为主(除非手动配置多进程),系统认为单个线程的未捕获异常可能导致应用处于不稳定状态,直接终止整个进程是避免后续更严重问题的安全策略。

内容的提问来源于stack exchange,提问作者Omkar T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:10:41