Android ExceptionThrowable 常见异常和解决方法 奔溃日志上报 monkey异常修改
java將所有的錯誤封裝為一個對象,其根本父類為Throwable, Throwable有兩個子類:Error和Exception。
注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
?
Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程序中應當盡可能去處理這些異常。
? ? ? ?運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。
? ????運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
? ? ? ?非運行時異常?(編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
問題:內存溢出不能捕獲的原因:
二,異常的捕獲方法:
try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。在以下4種特殊情況下,finally塊不會被執行:
1)在finally語句塊中發生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關閉CPU。
?
?try、catch、finally語句塊的執行順序:
1)當try沒有捕獲到異常時:try語句塊中的語句逐一被執行,程序將跳過catch語句塊,執行finally語句塊和其后的語句;
2)當try捕獲到異常,catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執行,但finally語句塊后的語句不會被執行;
3)當try捕獲到異常,catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執行的,當執行到某一條語句出現異常時,程序將跳到catch語句塊,并與catch語句塊逐一匹配,找到與之對應的處理程序,其他的catch語句塊將不會被執行,而try語句塊中,出現異常之后的語句也不會被執行,catch語句塊執行完后,執行finally語句塊里的語句,最后執行finally語句塊后的語句;
三,常見異常和處理方法
runtimeException子類:
1 .java.lang.NullPointerException2.?java.lang.IllegalArgumentException: n must be positive3.集合變化java.util.ConcurrentModificationException,Caused by: java.lang.ArrayIndexOutOfBoundsException4.動畫里面的算術java.lang.NumberFormatException: Invalid double: ""java.lang.ArithmeticException: divide by zero5.java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
奇葩的問題:1.圖片。類,找不到,混淆問題:android.content.res.Resources$NotFoundException: File res/drawable-xhdpi-v4/abnormal_purple_beg.png from drawable resource ID #0x7f0200082.沒有方法,可能是API低版本的不支持,java.lang.NoSuchMethodError3.java.util.concurrent.TimeoutException:4.java.lang.SecurityException: Not allowed to start activity Intent 5.Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died6.java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
7.java.lang.reflect.InvocationTargetExceptionIOException
1.數據庫的IO異常 ??android.database.sqlite.SQLiteDiskIOException:
2.文件沒有找到
3.android.database.sqlite.SQLiteException: cannot commit - no transaction is activeat android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:93)at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1900)at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1839)at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:714)at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:276)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:99)at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1741)at com.cx.module.data.apk.b$a.f(Unknown Source)at com.cx.module.data.apk.b$a.a(Unknown Source)at com.cx.module.data.apk.g.a(Unknown Source)at com.cx.module.data.center.b$1.run(Unknown Source)at java.lang.Thread.run(Thread.java:856)
Error:
Error:內存溢出:java.lang.OutOfMemoryError: Failed to allocate a 1868981625 byte allocation with 991781 free bytes and 509MB until OOM
Android 中出現的
1.有相同的ID
?java.lang.IllegalArgumentException:?Wrong?state?class,?expecting?View?State?but?received?class?android.widget.ProgressBar$SavedState?instead.?This?usually?happens?when?two?views?of?different?type?have?the?same?id?in?the?same?hierarchy.?This?view's?id?is?id/progressBar.?Make?sure?other?views?do?not?use?the?same?id. ?
2.大致意思是說我使用的 commit方法是在Activity的onSaveInstanceState()之后調用的,這樣會出錯,因為
?onSaveInstanceState方法是在該Activity即將被銷毀前調用,來保存Activity數據的,如果在保存玩狀態后
再給它添加Fragment就會出錯。解決辦法就是把commit()方法替換成 commitAllowingStateLoss()就行
解決IllegalStateException: Can not perform this action after onSaveInstanceState
3.Fragmentjava.lang.IllegalStateException: Fragment already added:
4.???Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
出現在Fragment或者是Adatper中!
?分析mInflater.inflate(R.layout.eg_refresh_message, this, false);
5.清理 ??TidyShowActivity ?back建和onsaveinstance, 不調用父類的方法就可以
5.listview中list和adapter不同步的問題6.?NetWorkOnMainThreadException ? ??不能在主線程聯網7.使用Fragment時遇到Binary
XML file line #9: Error inflating class fragment
解決方法:
fragment加入的Activity 應該繼承于 FragmentActivity8.java.net.SocketException:Noroute原因:wifi未打開,無路由解決方法:wifi未打開,重新打開
9. Can't create handler inside thread that has not called Looper.prepare()原因:不能在線程中操作主線程,比如在線程中創建dialog,更新UI等都是不可以的解決方法:在主線程中創建handler,通過handler.sendmessage()來更新UI,因為在主線程中創建的handler屬于主線程,起10.Android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application解決方案:將getApplication改成xxxx.this
全局捕獲異常并上報:?比如第三方的友盟、蒲公英等,騰訊Bugly
UncaughtExceptionHandler:在程序異常的時候,默認是把進程殺死,有們自己先上報然后手動再殺死進程!
在Android開發中,常常會出現uncheched Exception 導致程序的crash,為了提供良好的用戶體驗,并對出錯的信息進行收集,以便對程序進行改進,提高程序的健壯性。?因此,常使用Thread.UncaughtExceptionHandler來進行處理。
?
java將所有的錯誤封裝為一個對象,其根本父類為Throwable, Throwable有兩個子類:Error和Exception。
注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
?
Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程序中應當盡可能去處理這些異常。
? ? ? ?運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。
? ????運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
? ? ? ?非運行時異常?(編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
問題:內存溢出不能捕獲的原因:
二,異常的捕獲方法:
try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。在以下4種特殊情況下,finally塊不會被執行:
1)在finally語句塊中發生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關閉CPU。
?
?try、catch、finally語句塊的執行順序:
1)當try沒有捕獲到異常時:try語句塊中的語句逐一被執行,程序將跳過catch語句塊,執行finally語句塊和其后的語句;
2)當try捕獲到異常,catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執行,但finally語句塊后的語句不會被執行;
3)當try捕獲到異常,catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執行的,當執行到某一條語句出現異常時,程序將跳到catch語句塊,并與catch語句塊逐一匹配,找到與之對應的處理程序,其他的catch語句塊將不會被執行,而try語句塊中,出現異常之后的語句也不會被執行,catch語句塊執行完后,執行finally語句塊里的語句,最后執行finally語句塊后的語句;
三,常見異常和處理方法
runtimeException子類:
1 .java.lang.NullPointerException2.?java.lang.IllegalArgumentException: n must be positive3.集合變化java.util.ConcurrentModificationException,Caused by: java.lang.ArrayIndexOutOfBoundsException4.動畫里面的算術java.lang.NumberFormatException: Invalid double: ""java.lang.ArithmeticException: divide by zero5.java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
奇葩的問題:1.圖片。類,找不到,混淆問題:android.content.res.Resources$NotFoundException: File res/drawable-xhdpi-v4/abnormal_purple_beg.png from drawable resource ID #0x7f0200082.沒有方法,可能是API低版本的不支持,java.lang.NoSuchMethodError
3.java.util.concurrent.TimeoutException:4.java.lang.SecurityException: Not allowed to start activity Intent 5.Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died6.java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
IOException
1.數據庫的IO異常 ??android.database.sqlite.SQLiteDiskIOException:
2.文件沒有找到
轉存失敗重新上傳取消
3.android.database.sqlite.SQLiteException: cannot commit - no transaction is activeat android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:93)at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1900)at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1839)at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:714)at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:276)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:99)at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1741)at com.cx.module.data.apk.b$a.f(Unknown Source)at com.cx.module.data.apk.b$a.a(Unknown Source)at com.cx.module.data.apk.g.a(Unknown Source)at com.cx.module.data.center.b$1.run(Unknown Source)at java.lang.Thread.run(Thread.java:856)
Error:
Error:內存溢出:java.lang.OutOfMemoryError: Failed to allocate a 1868981625 byte allocation with 991781 free bytes and 509MB until OOM
Android 中出現的
1.有相同的ID
?java.lang.IllegalArgumentException:?Wrong?state?class,?expecting?View?State?but?received?class?android.widget.ProgressBar$SavedState?instead.?This?usually?happens?when?two?views?of?different?type?have?the?same?id?in?the?same?hierarchy.?This?view's?id?is?id/progressBar.?Make?sure?other?views?do?not?use?the?same?id. ?
2.大致意思是說我使用的 commit方法是在Activity的onSaveInstanceState()之后調用的,這樣會出錯,因為
?onSaveInstanceState方法是在該Activity即將被銷毀前調用,來保存Activity數據的,如果在保存玩狀態后
再給它添加Fragment就會出錯。解決辦法就是把commit()方法替換成 commitAllowingStateLoss()就行
解決IllegalStateException: Can not perform this action after onSaveInstanceState
3.Fragmentjava.lang.IllegalStateException: Fragment already added:
4.???Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
出現在Fragment或者是Adatper中!
?分析mInflater.inflate(R.layout.eg_refresh_message, this, false);
5.清理 ??TidyShowActivity ?back建和onsaveinstance, 不調用父類的方法就可以
5.listview中list和adapter不同步的問題6.?NetWorkOnMainThreadException ? ??不能在主線程聯網7.使用Fragment時遇到Binary
XML file line #9: Error inflating class fragment
解決方法:
fragment加入的Activity 應該繼承于 FragmentActivity8.java.net.SocketException:Noroute原因:wifi未打開,無路由解決方法:wifi未打開,重新打開
9. Can't create handler inside thread that has not called Looper.prepare()原因:不能在線程中操作主線程,比如在線程中創建dialog,更新UI等都是不可以的解決方法:在主線程中創建handler,通過handler.sendmessage()來更新UI,因為在主線程中創建的handler屬于主線程,起10.Android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application解決方案:將getApplication改成xxxx.this
全局捕獲異常并上報:比如第三方的友盟、蒲公英等,騰訊Bugly
UncaughtExceptionHandler:在程序異常的時候,默認是把進程殺死,有們自己先上報然后手動再殺死進程!
在Android開發中,常常會出現uncheched Exception 導致程序的crash,為了提供良好的用戶體驗,并對出錯的信息進行收集,以便對程序進行改進,提高程序的健壯性。因此,常使用Thread.UncaughtExceptionHandler來進行處理。
?
總結
以上是生活随笔為你收集整理的Android ExceptionThrowable 常见异常和解决方法 奔溃日志上报 monkey异常修改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员路在何方的辛苦工作
- 下一篇: APP全栈工程师修炼之路(二)