崩潰bug日誌總結2

目錄介紹

  • 1.1 java.lang.ClassNotFoundException類找不到異常
  • 1.2 java.util.concurrent.TimeoutException鏈接超時崩潰
  • 1.3 java.lang.NumberFormatException格式轉化錯誤
  • 1.4 java.lang.IllegalStateException: Fragment not attached to Activity
  • 1.5 ArrayIndexOutOfBoundsException 角標越界異常
  • 1.6 IllegalAccessException 方法中構造方法權限異常
  • 1.7 android.view.WindowManager$BadTokenException,dialog彈窗異常
  • 1.8 java.lang.NoClassDefFoundError 找不到類異常
  • 1.9 Android出現:Your project path contains non-ASCII characters.

好消息

  • 博客筆記大彙總【16年3月到至今】,包括Java基礎及深刻知識點,Android技術博客,Python學習筆記等等,還包括平時開發中遇到的bug彙總,固然也在工做之餘收集了大量的面試題,長期更新維護而且修正,持續完善……開源的文件是markdown格式的!同時也開源了生活博客,從12年起,積累共計47篇[近20萬字],轉載請註明出處,謝謝!
  • 連接地址:https://github.com/yangchong2...
  • 若是以爲好,能夠star一下,謝謝!固然也歡迎提出建議,萬事起於忽微,量變引發質變!

1.1 java.lang.ClassNotFoundException類找不到異常

  • A.詳細崩潰日誌信息php

    Didn't find class "om.scwang.smartrefresh.layout.SmartRefreshLayout" on path: DexPathList[[zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/base.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_dependencies_apk.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_slice_0_apk.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_slice_1_apk.apk", zip file "/data/app/com.paidian.hwmc-EsIbVq6e0mFwE0-rPanqdg==/split_lib_s
    com.paidian.hwmc.goods.activity.GoodsDetailsActivity.onCreate(GoodsDetailsActivity.java:209)
  • B.查看崩潰類信息java

    • 當應用程序嘗試使用字符串名稱加載類時引起:但沒法找到具備指定名稱的類的定義。從1.4版開始,已對此異常進行了修改,以符合通用的異常連接機制。在構建時提供並經過{@link#getException()}方法訪問的「在加載類時引起的可選異常」如今稱爲緣由,而且能夠經過{@link Throwable#getCace()}方法以及前面提到的「遺留方法」進行訪問。
    public class ClassNotFoundException extends ReflectiveOperationException {
        private static final long serialVersionUID = 9176873029745254542L;
        private Throwable ex;
        public ClassNotFoundException() {
            super((Throwable)null);  // Disallow initCause
        }
        public ClassNotFoundException(String s) {
            super(s, null);  //  Disallow initCause
        }
        public ClassNotFoundException(String s, Throwable ex) {
            super(s, null);  //  Disallow initCause
            this.ex = ex;
        }
        public Throwable getException() {
            return ex;
        }
        public Throwable getCause() {
            return ex;
        }
    }
  • C.項目中異常分析android

    • 該異常表示在路徑下,找不到指定類,一般是由於構建路徑問題致使的。
  • D.引起崩潰日誌的流程分析
  • F.解決辦法git

    • 類名是以字符串形式標識的,可信度比較低,在調用Class.forName(""),Class.findSystemClass(""),Class.loadClass("")等方法時,找不到類名時將會報錯。若是找不到的Class是系統Class,那麼多是系統版本兼容,廠家Rom兼容的問題,找到對應的設備嘗試重現,解決方法能夠考慮更換Api,或用本身實現的Class替代。
    • 若是找不到的Class是應用自由Class(含第三方SDK的Class),能夠經過反編譯工具查看對應apk中是否真的缺乏該Class,再進行定位,這種每每發生在:github

      • 1.要找的Class被混淆了,存在但名字變了;
      • 2.要找的Class未被打入Dex,確實不存在,多是由於本身的疏忽,或編譯環境的衝突;
      • 3.要找的Class確實存在,但你的Classlorder找不到這個Class,每每由於這個Classloder是你自實現的(插件化應用中常見)。
  • G.其餘延申

1.2 java.util.concurrent.TimeoutException鏈接超時崩潰

  • A.詳細崩潰日誌信息面試

    java.util.concurrent.TimeoutException: android.view.ThreadedRenderer.finalize() timed out after 10 seconds
    at android.view.ThreadedRenderer.nDeleteProxy(Native Method)
    at android.view.ThreadedRenderer.finalize(ThreadedRenderer.java:423)
  • B.查看崩潰類信息編程

    • 當阻塞操做超時引起的異常。指定超時的阻塞操做須要一種方法來指示已發生超時。對於許多此類操做,能夠返回指示超時的值;若是不可能或不須要,則應聲明並拋出{@code TimeoutException}。
    public class TimeoutException extends Exception {
        private static final long serialVersionUID = 1900926677490660714L;
        public TimeoutException() {}
        public TimeoutException(String message) {
            super(message);
        }
    }
  • C.項目中異常分析
  • D.引起崩潰日誌的流程分析
  • F.解決辦法segmentfault

    • 通常是系統在gc時,調用對象的finalize超時致使,解決辦法:
    • 1.檢查分析finalize的實現爲何耗時較高,修復它;
    • 2.檢查日誌查看GC是否過於頻繁,致使超時,減小內容開銷,防止內存泄露。
  • G.其餘延申

1.3 java.lang.NumberFormatException格式轉化錯誤

  • A.詳細崩潰日誌信息數組

    Exception in thread "main" java.lang.NumberFormatException: For input string: "100 "
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:458)
        at java.lang.Integer.parseInt(Integer.java:499)
  • B.查看崩潰類信息markdown

    • 引起,以指示應用程序試圖將字符串轉換爲數字類型之一,但該字符串沒有適當的格式。
    public class NumberFormatException extends IllegalArgumentException {
        static final long serialVersionUID = -2848938806368998894L;
    
        public NumberFormatException () {
            super();
        }
    
        public NumberFormatException (String s) {
            super (s);
        }
    
        static NumberFormatException forInputString(String s) {
            return new NumberFormatException("For input string: \"" + s + "\"");
        }
    }
  • C.項目中異常分析

    • 錯誤關鍵字 java.lang.NumberFormatException 這句話明確告訴了咱們是數字格式異常,接着後面有 For input string: "100 " 提示,這就告訴咱們,當前想把 "100 " 轉換成數字類型時出錯了,這樣就很確切了。
  • D.引起崩潰日誌的流程分析
  • F.解決辦法

    • 解決辦法很簡單,改爲 Integer.parseInt(str.trim()),注意將字符串轉化成整數數據類型時,注意須要trim一下。
  • G.其餘延申

1.4 java.lang.IllegalStateException: Fragment not attached to Activity

  • A.詳細崩潰日誌信息

    java.lang.IllegalStateException: Fragment not attached to Activity
  • B.查看崩潰類信息
  • C.項目中異常分析

    • 出現該異常,是由於Fragment的尚未Attach到Activity時,調用瞭如getResource()等,須要上下文Content的函數。
    • 出現該異常,是由於Fragment尚未Attach到Activity時,調用瞭如getResource()等,須要上下文Context的函數。解決方法,就是等將調用的代碼寫在OnStart()中。
  • D.引起崩潰日誌的流程分析
  • F.解決辦法

    • 將調用的代碼運行在Fragment Attached的生命週期內。
    • 第一種:在調用須要Context的函數以前,增長一個判斷isAdded()
    if(isAdded()){//isAdded方法是Android系統提供的,只有在Fragment被添加到所屬的Activity後才返回true
        activity.getResourses().getString(...);
    }
    • 第二種:以下所示
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        activity = (MainActivity) context;
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        if (activity != null) {
            activity = null;
        }
    }
  • G.其餘延申

    • 發生場景:該錯誤常常發生在fragment的線程中執行了一個耗時操做,線程在執行完畢後會調用getResources來更新ui。若是在線程操做沒有完成,就調用getActivity().recreate()從新加載activity或屏幕旋轉,這時就會出現Fragment not attached to Activity的錯誤

1.5 ArrayIndexOutOfBoundsException 角標越界異常

  • A.詳細崩潰日誌信息

    • 該異常表示數組越界
    java.lang.ArrayIndexOutOfBoundsException: 0
        at com.example.mytest.CityAdapter.setDataNotify(CityAdapter.java:183)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  • B.查看崩潰類信息

    • 引起,以指示已使用非法索引訪問數組。索引不是負的,就是大於或等於數組的大小。
    public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException {
        private static final long serialVersionUID = -5116101128118950844L;
        public ArrayIndexOutOfBoundsException() {
            super();
        }
        public ArrayIndexOutOfBoundsException(int index) {
            super("Array index out of range: " + index);
        }
        public ArrayIndexOutOfBoundsException(String s) {
            super(s);
        }
        public ArrayIndexOutOfBoundsException(int sourceLength, int index) {
            super("length=" + sourceLength + "; index=" + index);
        }
        public ArrayIndexOutOfBoundsException(int sourceLength, int offset,
                int count) {
            super("length=" + sourceLength + "; regionStart=" + offset
                    + "; regionLength=" + count);
        }
    }
  • C.項目中異常分析
  • D.引起崩潰日誌的流程分析
  • F.解決辦法

    • 這種狀況通常要在數組循環前作好length判斷,index超出length上限和下限時都會報錯。舉例以下:一個數組int test[N],一共有N個元素分別是test[0]~test[N-1],若是調用test[N],將會報錯。建議讀取時,不要超過數組的長度(array.length)。
    • Android中一種常見情形就是上拉刷新中header也會做爲listview的第0個位置,若是判斷失誤很容易形成越界。
  • G.其餘延申

1.6 IllegalAccessException 方法中構造方法權限異常

  • A.詳細崩潰日誌信息

    Unable to instantiate application com.pedaily.yc.meblurry.App: java.lang.IllegalAccessException
  • B.查看崩潰類信息

    • 當應用程序試圖反射地建立實例(數組除外)、設置或獲取字段或調用方法時,將引起IllegalAccessException,但當前執行的方法沒法訪問指定的類、字段、方法或構造函數的定義。
    public class IllegalAccessException extends ReflectiveOperationException {
        private static final long serialVersionUID = 6616958222490762034L;
        public IllegalAccessException() {
            super();
        }
        public IllegalAccessException(String s) {
            super(s);
        }
    }
  • C.項目中異常分析

    • 錯誤提示是,構造方法的權限不對
  • D.引起崩潰日誌的流程分析
  • F.解決辦法

    • 檢查了整個Application,才發現,原來有一個無參數的構造方法,被設計成private。修改其爲public便可。
  • G.其餘延申

    • android BroadcastReceiver遇到java.lang.IllegalAccessException解決方法,錯誤緣由主要是app中其餘地方調用了默認的構造函數,必須增長默認構造函數且訪問權限爲public

1.7 android.view.WindowManager$BadTokenException,dialog彈窗異常

  • A.詳細崩潰日誌信息

    Unable to add window -- token android.os.BinderProxy@9a57804 is not valid; is your activity running?
    android.view.ViewRootImpl.setView(ViewRootImpl.java:907)
  • B.查看崩潰類信息

    • 在WindowManager中能夠找到這個異常類,主要發生在嘗試添加視圖時引起的
    public static class BadTokenException extends RuntimeException {
        public BadTokenException() {
        }
    
        public BadTokenException(String name) {
            super(name);
        }
    }
  • C.項目中異常分析

    • 該異常表示不能添加窗口,一般是所要依附的view已經不存在致使的。
  • D.引起崩潰日誌的流程分析
  • F.解決辦法

    • 以前項目中有一個自定義彈窗,偶爾會報這個錯。解決辦法以下代碼所示
    • 主要邏輯是在彈窗show或者dismiss的時候,都增長了邏輯判斷,判斷宿主activity存在。
    /**
     * 展現加載窗
     * @param context               上下文
     * @param isCancel              是否能夠取消
     */
    public static void show(Context context,  boolean isCancel) {
        if(context == null){
            return;
        }
        if (context instanceof Activity) {
            if (((Activity) context).isFinishing()) {
                return;
            }
        }
        if (loadDialog != null && loadDialog.isShowing()) {
            return;
        }
        loadDialog = new LoadLayoutDialog(context, isCancel);
        loadDialog.show();
    }
    
    /**
     * 銷燬加載窗
     * @param context               上下文
     */
    public static void dismiss(Context context) {
        if(context == null){
            return;
        }
        try {
            if (context instanceof Activity) {
                if (((Activity) context).isFinishing()) {
                    loadDialog = null;
                    return;
                }
            }
            if (loadDialog != null && loadDialog.isShowing()) {
                Context loadContext = loadDialog.getContext();
                if (loadContext instanceof Activity) {
                    if (((Activity) loadContext).isFinishing()) {
                        loadDialog = null;
                        return;
                    }
                }
                loadDialog.dismiss();
                loadDialog = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            loadDialog = null;
        }
    }
  • G.其餘延申

    • Dialog&AlertDialog,Toast,WindowManager不能正確使用時,常常會報出該異常,緣由比較多,幾個常見的場景以下:

      • 1.上一個頁面沒有destroy的時候,以前的Activity已經接收到了廣播。若是此時以前的Activity進行UI層面的操做處理,就會形成crash。UI層面的刷新,必定要注意時機,建議使用set_result來代替廣播的形式進行刷新操做,避免使用廣播的方式,代碼不直觀且容易出錯。
      • 2.Dialog在Actitivty退出後彈出。在Dialog調用show方法進行顯示時,必需要有一個Activity做爲窗口的載體,若是Activity被銷燬,那麼致使Dialog的窗口載體找不到。建議在Dialog調用show方法以前先判斷Activity是否已經被銷燬。
      • 3.Service&Application彈出對話框或WindowManager添加view時,沒有設置window type爲TYPE_SYSTEM_ALERT。須要在調用dialog.show()方法前添加dialog.getWindow().SetType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)。
      • 4.6.0的系統上, (非定製 rom 行爲)若沒有給予懸浮窗權限, 會彈出該問題, 能夠經過Settings.canDrawOverlays來判斷是否有該權限.
      • 5.某些不穩定的MIUI系統bug引發的權限問題,系統把Toast也當成了系統級彈窗,android6.0的系統Dialog彈窗須要用戶手動受權,若果app沒有加入SYSTEM_ALERT_WINDOW權限就會報這個錯。須要加入給app加系統Dialog彈窗權限,並動態申請權限,不知足第一條會出現沒權限閃退,不知足第二條會出現沒有Toast的狀況。

1.8 java.lang.NoClassDefFoundError 找不到類異常

  • A.詳細崩潰日誌信息
  • B.查看崩潰類信息

    • 若是Java虛擬機或ClassLoader實例試圖加載類的定義(做爲普通方法調用的一部分或使用新的表達式建立新實例的一部分),則拋出該類的定義。編譯當前執行的類時存在搜索類定義,但沒法再找到該定義。
    public class NoClassDefFoundError extends LinkageError {
        private static final long serialVersionUID = 9095859863287012458L;
        public NoClassDefFoundError() {
            super();
        }
        public NoClassDefFoundError(String s) {
            super(s);
        }
        private NoClassDefFoundError(String detailMessage, Throwable throwable) {
            super(detailMessage, throwable);
        }
    }
  • C.項目中異常分析

    • 問題的主要緣由:方法數超65536限制。因爲實際開發當中的需求不斷變動,開源框架愈來愈多,大多都用第三方SDK,致使方法數很容易超出65536限制。出現錯誤Java.lang.NoClassDefFoundError
  • D.引起崩潰日誌的流程分析

    • 這個錯誤是Android應用的方法總數限制形成的。android平臺的Java虛擬機Dalvik在執行DEX格式的Java應用程序時,使用原生類型short來索引DEX文件中的方法。這意味着單個DEX文件可被引用的方法總數被限制爲65536。一般APK包含一個classes.dex文件,所以Android應用的方法總數不能超過這個數量,這包括Android框架、類庫和你本身開發的代碼。而Android 5.0和更高版本使用名爲ART的運行時,它原生支持從APK文件加載多個DEX文件。在應用安裝時,它會執行預編譯,掃描classes(..N).dex文件而後將其編譯成單個.oat文件用於執行. 通熟的講,就是分包。
  • F.解決辦法

    • 64k解決辦法
  • G.其餘延申

    • 該異常表示找不到類定義,當JVM或者ClassLoader實例嘗試裝載該類的定義(這一般是一個方法調用或者new表達式建立一個實例過程的一部分)而這個類定義並無找時所拋出的錯誤。
    • [解決方案]:NoClassDefFoundError異常通常出如今編譯環境和運行環境不一致的狀況下,就是說有可能在編譯事後更改了Classpath或者jar包因此致使在運行的過程當中JVM或者ClassLoader沒法找到這個類的定義。

      • 1.分dex包編程,若是依賴的dex包刪除了指定的類,執行初始化方法時將會報錯;
      • 2.使用第三方SDK或插件化編程時,動態加載或實例化類失敗將會報錯;
      • 3.系統資源緊張時,當大量class須要加載到內存的時候,處於競爭關係,部分calss競爭失敗,致使加載不成功;
      • 4.裝載並初始化一個類時失敗(好比靜態塊拋 java.lang.ExceptionInInitializerError 異常),而後再次引用此類也會提示NoClassDefFoundErr 錯誤;
      • 5.手機系統版本或硬件設備不匹配(如ble設備只支持18以上SDK),程序引用的class在低版本中不存在,致使NoClassDefFoundErr 錯誤。
      • 6.so文件找不到,設備平臺armeabi-v7a,可是個人so庫是放在armeabi中的,解決方法新建一個armeabi-v7a包,而且把armeabi的文件拷貝過來.

1.9 Android出現:Your project path contains non-ASCII characters.

  • A.詳細崩潰日誌信息
  • B.查看崩潰類信息
  • C.項目中異常分析
  • D.引起崩潰日誌的流程分析
  • F.解決辦法

    • 很好解決啦,就是你的工程項目路徑或者項目名稱包含了中文,修改相關的名稱就好
  • G.其餘延申

關於其餘內容介紹

01.關於博客彙總連接

02.關於個人博客

相關文章
相關標籤/搜索