我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android Java try catch失效问题如何解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android Java try catch失效问题如何解决

这篇文章主要介绍了Android Java try catch失效问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android Java try catch失效问题如何解决文章都会有所收获,下面我们一起来看看吧。

    解决办法

    方法一

    如果在 异常抛出处 或 外层调用函数中 使用了 Runnable run 函数, try catch 需要添在 run 函数里面, 如下:

    new Thread(new Runnable() {                @Override                public void run() {                    try {                        throw new IllegalArgumentException("test exception");                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }).start();

    如果使用的是第三方库, 无法捕获 Runnable run 函数中的异常时, 则可在 Runnable 之前添加如下代码解决(需注意: 此方法在 Android 中子线程可用, 主线程仍会 crash):

    // 在调用第三方库前先执行下面代码Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {                @Override                public void uncaughtException(Thread t, Throwable e) {                     // 这里就可以捕获到第三方库的异常了                   }            });  // 假如这里是一个第三方库抛出异常的地方new Thread(new Runnable() {                @Override                public void run() {                    // 子线程 -> 抛出异常                    throw Exception("unknown exception");                }            }).start();

    在 Android 中, 如果无法捕获 Runnable run 函数中的异常, 并且是在主线程调用, 就只能想办法避免 crash 了. 

    比如我是在调用 show 函数之前有网络请求, 网络请求成功后, 此页面已不在前台, 才会导致 crash; 可以在网络请求成功后, 判断此页面是否在前台展示, 再执行相关操作.

    事情起因

    新版上线后, 出现了这个 crash. 经排查, 发现 crash 是从第三方库中抛出的, 位置如下: 

    2021-12-23 17:39:57.408 3535-3535/com.podbean.app.podcast E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.podbean.app.podcast, PID: 3535
        java.lang.IllegalArgumentException: the view is not showing in the window!
            at com.app.hubert.guide.util.ViewUtils.getLocationInView(ViewUtils.java:47)
            at com.app.hubert.guide.model.HighlightView.fetchLocation(HighlightView.java:77)
            at com.app.hubert.guide.model.HighlightView.getRectF(HighlightView.java:67)
            at com.app.hubert.guide.model.RelativeGuide.getMarginInfo(RelativeGuide.java:90)
            at com.app.hubert.guide.model.RelativeGuide.getGuideLayout(RelativeGuide.java:76)
            at com.app.hubert.guide.core.GuideLayout.addCustomToLayout(GuideLayout.java:227)
            at com.app.hubert.guide.core.GuideLayout.onAttachedToWindow(GuideLayout.java:185)
            at android.view.View.dispatchAttachedToWindow(View.java:20479)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3489)
            at android.view.ViewGroup.addViewInner(ViewGroup.java:5278)
            at android.view.ViewGroup.addView(ViewGroup.java:5064)
            at android.view.ViewGroup.addView(ViewGroup.java:5036)
            at com.app.hubert.guide.core.Controller.showGuidePage(Controller.java:175)
            at com.app.hubert.guide.core.Controller.access$200(Controller.java:39)
            at com.app.hubert.guide.core.Controller$1.run(Controller.java:118)
            at android.os.Handler.handleCallback(Handler.java:938)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:223)
            at android.app.ActivityThread.main(ActivityThread.java:7664)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

    根据 log 信息, 最终我找到了这里

    // ViewUitls.javapublic static Rect getLocationInView(View parent, View child) {    ...    if (tmp == null) {        // 异常抛出位置        throw new IllegalArgumentException("the view is not showing in the window!");            }    ...}  // Controller.javapublic void show() {        ...        // 使用 Runnable run 位置        mParentView.post(new Runnable() {            @Override            public void run() {                ...                // showGuidePage 会调用到异常抛出的位置                showGuidePage();                ...            }        });    }

    发现在 show 函数中, 有关键代码 mParentView.post(runnable), 此时, 异常就是在 run 函数中调用的 showGuidePage 中抛出的, 并且这个异常在主线程中, 主线程就会停止掉, 就会 crash!

    关于“Android Java try catch失效问题如何解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Android Java try catch失效问题如何解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Android Java try catch失效问题如何解决

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Android Java try catch失效问题如何解决

    这篇文章主要介绍了Android Java try catch失效问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android Java try catch失效问题如何解决文章都会有所收获,下面我们
    2023-07-04

    如何解决@Transactional遇到try catch失效的问题

    这篇文章给大家分享的是有关如何解决@Transactional遇到try catch失效的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。@Transactional遇到try catch失效Springboo
    2023-06-29

    如何解决php header 失效问题

    php header失效的解决办法:1、取消location和“:”符号之间的空格;2、在用header前不能有任何的输出;3、修改php.ini打开缓存,并将“output_buffering=0”修改成409。
    2021-12-15

    如何解决nginx php session失效问题

    nginx php session失效的解决办法:1、获取session目录;2、更改用户组;3、设置“session.use_trans_sid=1”即可。
    2019-07-18

    jdbc连接失效问题如何解决

    要解决JDBC连接失效问题,可以尝试以下几个方法:检查数据库服务器是否正常运行:确保数据库服务器正常运行并且可以接收连接。可以通过尝试使用其他工具(如数据库管理工具)连接数据库来确认。检查网络连接:确保网络连接正常,包括数据库服务器和应用程
    2023-10-24

    如何解决php验证码失效问题

    这篇“如何解决php验证码失效问题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何解决php验证码失效问题”文章吧。php
    2023-07-04

    如何解决服务器端缓存失效的问题

    这篇文章主要讲解了“如何解决服务器端缓存失效的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决服务器端缓存失效的问题”吧!缓存失效情况举例看下这个段伪代码:代码如下:local v
    2023-06-10

    解决pageHelper分页失效以及如何配置问题

    这篇文章主要介绍了解决pageHelper分页失效以及如何配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-14

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录