91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android?Java?try?catch失效問題如何解決

發布時間:2022-11-25 10:06:56 來源:億速云 閱讀:201 作者:iii 欄目:開發技術

這篇文章主要介紹了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.java
    public static Rect getLocationInView(View parent, View child) {
        ...
        if (tmp == null) {
            // 異常拋出位置
            throw new IllegalArgumentException("the view is not showing in the window!");
                }
        ...
    }
     
     
    // Controller.java
    public 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失效問題如何解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    夏邑县| 雷州市| 濮阳县| 巴彦淖尔市| 罗源县| 赤峰市| 隆德县| 上饶市| 甘泉县| 荥经县| 安国市| 桃源县| 泾源县| 石楼县| 黎川县| 六枝特区| 库伦旗| 汉寿县| 日喀则市| 梨树县| 绩溪县| 商水县| 贡嘎县| 思南县| 敖汉旗| 阿拉尔市| 沧源| 大化| 临沧市| 花垣县| 长汀县| 普兰店市| 绥芬河市| 樟树市| 饶河县| 高阳县| 云安县| 长春市| 盐边县| 镇赉县| 辽宁省|