摘要:出現錯誤引發崩潰日志的流程分析這個錯誤是應用的方法總數限制造成的。
目錄介紹
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.詳細崩潰日志信息
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.查看崩潰類信息
當應用程序嘗試使用字符串名稱加載類時引發:但無法找到具有指定名稱的類的定義。從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.項目中異常分析
該異常表示在路徑下,找不到指定類,通常是因為構建路徑問題導致的。
D.引發崩潰日志的流程分析
F.解決辦法
類名是以字符串形式標識的,可信度比較低,在調用Class.forName(""),Class.findSystemClass(""),Class.loadClass("")等方法時,找不到類名時將會報錯。如果找不到的Class是系統Class,那么可能是系統版本兼容,廠家Rom兼容的問題,找到對應的設備嘗試重現,解決方法可以考慮更換Api,或用自己實現的Class替代。
如果找不到的Class是應用自由Class(含第三方SDK的Class),可以通過反編譯工具查看對應apk中是否真的缺少該Class,再進行定位,這種往往發生在:
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.解決辦法
一般是系統在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.查看崩潰類信息
引發,以指示應用程序試圖將字符串轉換為數字類型之一,但該字符串沒有適當的格式。
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.關于博客匯總鏈接1.技術博客匯總
2.開源項目匯總
3.生活博客匯總
4.喜馬拉雅音頻匯總
5.其他匯總
02.關于我的博客我的個人站點:www.yczbj.org,www.ycbjie.cn
github:https://github.com/yangchong211
知乎:https://www.zhihu.com/people/...
簡書:http://www.jianshu.com/u/b7b2...
csdn:http://my.csdn.net/m0_37700275
喜馬拉雅聽書:http://www.ximalaya.com/zhubo...
開源中國:https://my.oschina.net/zbj161...
泡在網上的日子:http://www.jcodecraeer.com/me...
郵箱:yangchong211@163.com
阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV
segmentfault頭條:https://segmentfault.com/u/xi...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71827.html
摘要:詳細崩潰日志信息查看崩潰類信息當調用或其變體之一失敗時,會引發此異常,因為無法找到執行給定意圖的活動。引發崩潰日志的流程分析問題所在是方法。 目錄介紹 1.1 OnErrorNotImplementedException【 Cant create handler inside thread that has not called Looper.prepare()】 1.2 adb.e...
摘要:項目中異常分析引發崩潰日志的流程分析解決辦法常見的出現場景狀態異常非法線程操作。引發崩潰日志的流程分析解釋如下所示,釋放與此位圖關聯的本機對象,并清除對像素數據的引用。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫異常 1.2 java.lang.IllegalStateException非法狀態異常 1.3 android.conten...
摘要:換句話說,環境或應用程序沒有處于請求操作的適當狀態。項目中異常分析引發崩潰日志的流程分析解決辦法常見的出現場景狀態異常非法線程操作。導致的方法出來顯示消息位于該消息之后,遲遲沒有執行。這時候,的超時檢測結束,刪除了服務中的記錄。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫異常 1.2 java.lang.IllegalStateExce...
閱讀 3512·2021-11-17 17:01
閱讀 3918·2021-11-08 13:12
閱讀 2477·2021-10-08 10:04
閱讀 686·2021-09-29 09:35
閱讀 1418·2021-09-26 10:12
閱讀 2019·2021-09-07 09:58
閱讀 1953·2019-08-30 15:55
閱讀 2134·2019-08-30 13:14