V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
t4we
V2EX  ›  Android

安卓遇到未捕获的 Java 异常会直接崩溃,为什么要这么设计

  •  
  •   t4we · 2021-08-20 13:12:40 +08:00 · 9000 次点击
    这是一个创建于 1170 天前的主题,其中的信息可能已经有所发展或是发生改变。

    既然代码都跑在消息循环里,为什么非 debug 版本的 app,系统不主动捕获异常,然后处理下一个消息?这样用户体验不是更好吗?

    15 条回复    2021-08-21 17:05:14 +08:00
    haaro
        1
    haaro  
       2021-08-20 13:58:17 +08:00   ❤️ 1
    “系统主动捕获异常,然后处理下一个消息”会导致后续的逻辑出现更大更不可控的问题,有点类似连锁反应
    misaka19000
        2
    misaka19000  
       2021-08-20 14:00:22 +08:00
    防止异常被吃掉吧
    chendy
        3
    chendy  
       2021-08-20 14:04:15 +08:00
    开发者没处理的异常,系统也不知道该怎么处理
    与其让 app 以未知的状态强行继续运行不如直接崩掉
    gamexg
        4
    gamexg  
       2021-08-20 14:04:36 +08:00
    fail-fast

    能编译时就编译时出错,
    运行时发现错误就立刻出错,而不是把错误数据带到后面
    方便排查问题
    unco020511
        5
    unco020511  
       2021-08-20 14:05:25 +08:00
    关键系统不知道怎么运行了啊
    AoEiuV020
        6
    AoEiuV020  
       2021-08-20 14:07:15 +08:00
    方便排查 bug 吧,等继续执行直到下不去了,这个源头就很难追溯了,
    xylxAdai
        7
    xylxAdai  
       2021-08-20 14:09:48 +08:00   ❤️ 1
    不快点崩掉,等这个异常没处理在几分钟之后因为这个异常崩了,你堆栈咋找到嘛。
    dqzcwxb
        8
    dqzcwxb  
       2021-08-20 14:12:28 +08:00   ❤️ 3
    因为你不关心会产生什么问题,你只是嫌麻烦
    chengyiqun
        9
    chengyiqun  
       2021-08-20 14:46:21 +08:00
    那样我敢肯定会有一堆带着大量 bug 上线的 app.
    zongren
        10
    zongren  
       2021-08-20 16:31:13 +08:00
    其实应该优化一下,个别异常可以不崩
    silymore
        11
    silymore  
       2021-08-20 18:59:01 +08:00 via iPhone   ❤️ 1
    普通的 java 异步线程挂了还是正常跑啊
    Keyi
        12
    Keyi  
       2021-08-21 09:10:22 +08:00
    App 用户体验不是 Android 来保证而是 App 来保证的吧
    WebKit
        13
    WebKit  
       2021-08-21 10:12:01 +08:00 via Android
    这。无论起 java 还是 C 层的崩溃。。你可以自己拦截处理异常。
    xingda920813
        14
    xingda920813  
       2021-08-21 11:49:09 +08:00
    我觉得其实没有必要崩溃. 普通的 Java SE 和服务端的 Tomcat 都是这样, 一个线程抛未捕获的异常, 不会导致整个 JVM 结束. 一个请求异常, 那个请求会返回 500 错误, 但整个 Web 容器不会挂掉.
    ikas
        15
    ikas  
       2021-08-21 17:05:14 +08:00
    问题是..一旦出了异常,ui 线程中各种状态就会变得复杂..就跟为啥要限制 ui 使用单线程一样
    关于消息循环,你也可以通过一个技巧来捕捉异常..但是即使你捕捉了异常..你会发现你能做得也很少..出错的 ui 部分就"卡住"了..这时候就需要复杂的来处理,,比如直接重建相关 ui..然后事情就各种复杂了...

    //
    new Handler(mainLooper).post(() -> {
    while (true) {
    try {
    Looper.loop();
    } catch (MainLoopExitException e) {
    running = false;
    return;
    } catch (Throwable e) {
    //处理逻辑
    }
    }
    });
    //github 其实是有这样的写好的异常处理的.已经带了 ui 部分的处理.不过我忘记了是啥了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2728 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 12:25 · PVG 20:25 · LAX 05:25 · JFK 08:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.