最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android?Java?try?catch?失效問題及解決

 更新時間:2022年11月24日 16:50:29   作者:吃飽很舒服  
這篇文章主要介紹了Android?Java?try?catch?失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

參考:

如果你在 異常拋出處 的 外層函數(shù) 中添加了 try catch 不生效的話, 就試試下面的辦法吧.

解決辦法

方法一

如果在 異常拋出處 或 外層調(diào)用函數(shù)中 使用了 Runnable run 函數(shù), try catch 需要添在 run 函數(shù)里面, 如下:

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

如果使用的是第三方庫, 無法捕獲 Runnable run 函數(shù)中的異常時, 則可在 Runnable 之前添加如下代碼解決(需注意: 此方法在 Android 中子線程可用, 主線程仍會 crash):

// 在調(diào)用第三方庫前先執(zhí)行下面代碼
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 函數(shù)中的異常, 并且是在主線程調(diào)用, 就只能想辦法避免 crash 了. 

比如我是在調(diào)用 show 函數(shù)之前有網(wǎng)絡(luò)請求, 網(wǎng)絡(luò)請求成功后, 此頁面已不在前臺, 才會導(dǎo)致 crash; 可以在網(wǎng)絡(luò)請求成功后, 判斷此頁面是否在前臺展示, 再執(zhí)行相關(guān)操作.

事情起因

新版上線后, 出現(xiàn)了這個 crash. 經(jīng)排查, 發(fā)現(xiàn) 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)

根據(jù) 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 會調(diào)用到異常拋出的位置
                showGuidePage();
                ...
            }
        });
    }

發(fā)現(xiàn)在 show 函數(shù)中, 有關(guān)鍵代碼 mParentView.post(runnable), 此時, 異常就是在 run 函數(shù)中調(diào)用的 showGuidePage 中拋出的, 并且這個異常在主線程中, 主線程就會停止掉, 就會 crash!

總結(jié)

起先, 我是自己 throw Exception, 但 try catch 都是正常生效的, 始終無法復(fù)現(xiàn)線上的 crash. 后來靈光一閃, 想到在子線程中拋出異常會怎樣呢? 經(jīng)過嘗試, 的確 catch 不到 子線程的 Exception, 具體原因不了解.... 或許我們可以把結(jié)果看成一個定義. 然后就在網(wǎng)上查了相關(guān)問題。

結(jié)論如下:

在 Java 中, 線程中的異常是不能拋出到調(diào)用該線程的外部方法中捕獲的.(我覺得這句話可改為, 在 Android 的 Runnable run 函數(shù)中的異常是不能拋出到外部方法中捕獲的. 因?yàn)樵?Android 的主線程中使用 Runnable run 函數(shù), 不在 run 函數(shù)中 try catch 的話, 仍會 crash!)

因?yàn)榫€程是獨(dú)立執(zhí)行的代碼片斷, 線程的問題應(yīng)該由線程自己來解決, 而不要委托到外部. 基于這樣的設(shè)計(jì)理念, 在 Java 中, 線程方法的異常都應(yīng)該在線程代碼邊界之內(nèi)(run 方法內(nèi))進(jìn)行 try catch 并處理掉. 換句話說, 我們不能捕獲從線程中逃逸的異常.

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android藍(lán)牙聊天開源項(xiàng)目

    Android藍(lán)牙聊天開源項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了Android藍(lán)牙聊天開源項(xiàng)目的開發(fā),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解Android中的多線程斷點(diǎn)下載

    詳解Android中的多線程斷點(diǎn)下載

    本文主要介紹了Android中多線程下載的幾個步驟以及實(shí)現(xiàn)功能的具體代碼,具有很好的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • Android進(jìn)階篇-自定義圖片伸縮控件具體實(shí)例

    Android進(jìn)階篇-自定義圖片伸縮控件具體實(shí)例

    這篇文章介紹了Android自定義圖片伸縮控件具體實(shí)例,有需要的朋友可以參考一下
    2013-11-11
  • Android中播放Gif動畫取巧的辦法

    Android中播放Gif動畫取巧的辦法

    本文給大家介紹Android中播放Gif動畫取巧的辦法的相關(guān)資料,涉及到android 播放gif動畫相關(guān)知識,感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽

    Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽

    這篇文章主要為大家介紹了Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Android集成新浪微博第三方登錄的方法

    Android集成新浪微博第三方登錄的方法

    這篇文章主要介紹了Android集成新浪微博第三方登錄的方法,完整講述了Android集成新浪微博第三方登錄的詳細(xì)步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-01-01
  • Android動畫之雷達(dá)掃描效果

    Android動畫之雷達(dá)掃描效果

    雷達(dá)掃描效果在我們?nèi)粘?jīng)??吹?,比如在新浪微博上有一個雷達(dá)功能,感覺類似于微信附近的人。只是多了一個類似于雷達(dá)掃描效果的動畫,某些知名安全軟件也有這樣的雷達(dá)效果,因此今天在這里小編帶著大家學(xué)習(xí)一下。
    2016-08-08
  • Android基于MLKit實(shí)現(xiàn)條形碼掃碼的代碼示例

    Android基于MLKit實(shí)現(xiàn)條形碼掃碼的代碼示例

    這篇文章將借助開源庫?MLKit?實(shí)現(xiàn)條形碼掃描,對于商品條形碼也可以很好地識別成功,該庫的使用內(nèi)容非常豐富,除了條碼識別,還有文字識別、圖像標(biāo)記、人臉檢測等等,本文篇文章就只介紹最基本的條形碼掃描使用,需要的朋友可以參考下
    2023-08-08
  • MobLink?Android?快速集成指南

    MobLink?Android?快速集成指南

    這篇文章主要為大家介紹了MobLink?Android?快速集成指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android開發(fā)自定義雙向SeekBar拖動條控件

    Android開發(fā)自定義雙向SeekBar拖動條控件

    這篇文章主要為大家介紹了Android開發(fā)自定義雙向SeekBar拖動條控件使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評論

新兴县| 涟源市| 安陆市| 河东区| 丹棱县| 东方市| 舟曲县| 钦州市| 柯坪县| 柳河县| 临泉县| 酉阳| 右玉县| 上饶县| 沾化县| 安多县| 东源县| 滨海县| 南乐县| 开鲁县| 河东区| 封开县| 许昌市| 岫岩| 湟源县| 浦江县| 青神县| 西青区| 常山县| 衡南县| 延吉市| 肃宁县| 南宁市| 甘德县| 卢龙县| 祥云县| 买车| 东海县| 栾川县| 天津市| 黑河市|