一个不一样的 ANR /2019/01/18/%E4%B8%80%E4%B8%AA%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84%20ANR/
经过一番查找与验证,我发现原因大致是,当一个 Java 线程抛出了未捕获的异常时,JVM 先会调用到 UncaughtExceptionHandler,然后再会把此线程停止掉。所以这段代码中,如果主线程抛出异常,那么第 6 行的方法结束后,主线程就会被 JVM 给停止掉,既然主线程都停止掉了,那自然就无响应了,也就会发生 ANR 了。
事实上,一般我们设置自定义 UncaughtExceptionHandler 时,都会在自定义的 uncaughtException 方法最后再调用一遍被我们顶替掉的系统默认的 UncaughtExceptionHandler,以便把应用 kill 掉,而这个例子,充分的显示了,当未捕获异常发生后,就算赖着不 kill 掉应用也是不行的,因为可能主线程都已经被停掉了。