名稱 | 關鍵字 | 發生頻率 | 發生場景 | 解決方式 |
空指針 | NullPointException | 1.調用接口時,過於信息返回數據 ,一旦爲空的Json,引起崩潰 2.在使用asyncTask調用接口返回數據,在asyncTask的doInBackGround中,會由於有空而崩潰 3.頁面跳轉先後,跳轉前的數據沒有準備好 , 4.APP過多的使用全局變量 ,一旦發生內存回收,這些全局變量會被設置爲空,而又沒有考慮這種狀況 。 |
1.方法須要對傳入的參數判空或者try...catch後再繼續使用 2. 3.調用外部接口確保返回值不爲空,甚至確保執行該接口不會拋異常,致使程序的退出。 4.避免使用全局變量,不到萬不得已不要使用全局變量,也要使全局支持序列號本地機制,一旦爲空就經過fang |
|
角標越界 | IndexOutOfBoundsException(基類) StringIndexOutOfBoundsException(字符串截取越界) ArrayIndexOutOfBoundsException(數組越界) |
1.因爲程序不嚴謹致使 2.在使用字符串時,常用subString(start ,end) 。start ,end超過字符串長度,就會崩潰 。 |
1.在遍歷一個數組/集合時要預判數組集合是否爲空 ,長度是否大於0; 2.在使用數組、集合中的元素時,要預判數組集合長度是否有那麼長 。 |
|
試圖調用一個空對象的方法 | Attempt to invoke virtual method on a null object reference 試圖在一個空對象引用調用虛方法 |
1.在一個activity中,調用另外一個activity的方法 ,爲此在B中創建一個static 變量 ,當這個static 變量被回收時 ,便會有異常。 2.推送 ,點擊推送消息根據事先定好的協議,跳過首頁直接進入二級甚至三級 。這時二級界面要是有首頁的某個對象是,該對象勢必爲空。 |
沒實例化 | |
類型轉換異常 | ClassCastException:classA cannot be cast to classB | Object x =new Integer(0) ; String str =(String)x; |
將安全類型轉換函數 把字符串轉換爲整數 小數或布爾類型時,咱們要爲指定轉換失敗時的默認值。不然,就會獲得一個空值。 |
|
數字轉換錯誤 | NumberFormatException | 在數據類型轉換過程當中 ,若是轉換不成功,通常會拋出ClassCastException的異常 。有一個例外 ,字符型轉換爲數字失敗時 ,時Android系統會拋出NumberFormatException異常 ( 如String abc ="123****45" int result =Integer.parseInt(abc) ; ) |
這種狀況發生在服務器返回數據沒有按照約定返回整數而是字符串 ,客戶端必須考慮到這種狀況,若是轉換失敗,必須有默認值不然直接崩潰 | |
聲明數組長度爲-1 | NegativeArraySizeException | 數組大小爲負值異常 ,單前使用負數大小建立數組時拋出該異常。場景 String[] arg1 =new String[args.length -1] ; args沒有元素時 。 |
若是數組長度是由另外一個變量動態獲得時 ,要保證中括號[] 中的值必須大於0 | |
遍歷集合的同時刪除其中的元素 | ConcurrModificationException | 1.遍歷一個集合不能刪除該集合中的元素 2.多線程中刪除同一個集合的元素(線程安全) |
解決方案:須要再定義一個列表結合delList ,來保存須要刪除的對象 | |
比較器使用不當 | comparsion method violates its general contrac | 由於Comparator 的compare的方法使用的姿式不對(他是基於插入排序與歸併排序算法相結合的產物 ,要比平常所用的冒泡排序算法快不少) | (單元測試) | |
當除數爲0 | Java.lang.ArithmeticException:divide by zero | 當程序中執行一個除法時 ,若是除數爲0 ,就會發生該狀況 . |
||
不能隨便使用aslist | AbstractList (add remove) 子類 ArrayList (add remove) Arrays$Arraylist (沒有實現 (add he remove)) |
|||
找不到類(一) | classNotFoundException | 當咱們動態加載一個類時候 ,若是該類運行時找不到,就會拋異常 如 class.forName("com.company.package.class") ; 因爲類的全名稱是字符串形式 ,這個頗有多是不正確 。 還有 findSystemClass("classname") loadClass("classname") ; |
||
找不到類(二) | NoClassDefFoundError | ClassA obj= new ClassA() ; 打包B和A分別位於不一樣的dex中 ,這時在A所在的dex中把A類刪除了 一般插件化編程會扯出這個異常由於要使用DexClassLOder。 |
||
activity 相關異常 |
||||
找不到Activity | Android content,activityNotFoundException:NO activty found to handle Intent{....} | 1.錯誤緣由 URL 不是以http開頭 Uri uti =Uri.parse("www.baidu.com"); Intent intent =new Intent ........ 2.打開SD卡上的一個html頁面時 ,沒有爲Intent指定打開Html頁面所須要的瀏覽器 3.調用百度地圖時openBaiduMapNavi 手機沒有安裝百度地圖客戶端 。(要判讀是否安裝) |
||
不能實例化activity | java.lang.RuntimeException:Unable to instantiate to activity ComponentInfo | 1.一般沒有AndroidManifext.xml 清單中註冊activity 。 2.系統處於異常狀態(內存不足)致使部件初始化 。 |
||
找到service | Java.lang.RuntimeException:Unable to instance receiver | 1.檢查代碼中是否有Class.forName("Class1") 2.ProGuard 會將class1 混淆 ,從而找不到這個類 。 |
||
不能啓動BroadcastRece | unable to start reciver | 1.在推送時,會和APP事先定義好協議,點擊推送消息就跳過首頁直接進入二級頁面。 2.Content中有一個startActivity方法 ,Activity繼承自Content ,重載startActivity方法,若是activity使用startActivity方法,不會有任何限制,若是使用Context的startActivity方法的話,就須要開啓一個新的task,就須要開啓一個新的task ,就會出現異常須要添加一個fiag |
使用activity之外的content來startActivity ,好比BroadCastReceiver,就必須爲Intent.FLAG_ACTIVITY_NEW_TASK,不然就會拋異常 。 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
|
startActivityForResult不能回傳 | failure delivering result ResultInfo{who=null ,request =0 ;result=-1} | startActivityForResult,傳回來的可key是A ,但按照B這個Key來取值 | ||
猴急的fragment | Fragment not attacher to Activity | 由於fragment在尚未Attach到activity時,調用諸如getResource這樣的方法 。 如getResource.getString(R.string.app_name) ; |
解決方案 if(isAdded){ getResources().getString(R.string.app_name)} isAdd方法是Android系統提供的,它只有在fragment被添加到所屬activity後纔會返回ture。 |
|
序列號相關異常 |
||||
實體對象不支持序列號 | Parcelable encountered IOEXception writing serializable object(name=xx) | 如 :該類裏面存在自定義實體 ,而該自定義實體未序列化。。。。 | ||
序列化時未指定ClassLoader | BadParcelableException:ClassNotFoundException when unmarshalling | 在使用Parcelable 機制時 。 a =in.readParcelable(null) ; |
private MyParcelable(Parcel in){ mStr =in.readString() ; a=in.readParcelable(ClassA.class.getClassLoader()) } |
|
ClassLoader | classNotFoundException 。 | 當ClassLoader爲空時系統採起默認的ClassLoader。 Android有兩種ClassLoader:framework classLoader和apk ClassLoader ,其中framework ClassLoader知道怎麼加載Android的系統的內部的類 ;apk ClassLoader知道怎麼加載咱們本身寫的類 ,也知道怎麼加載Android系統的內部的類 。在APP剛啓動時,默認的ClassLoader是apk ClassLoader ,但在系統內存不足應用會被系統回收再次啓動的,這個默認的ClassLoader會變成framework ClassLoader ,因此對於咱們本身的類會報classNotFoundException 。 |
||
反序列化時發現類找不到:被ProGuard混淆致使的崩潰 | parcelable encountered ClassNotFoundException reading a Serializable object .. | ProGuard 對於Class.forName(className)中的class無能爲力,他會將這個class混淆的面目全非,因而在反序列化時找不到這個類。 | 在ProGuard中keep這個類 | |
反序列化時發現類找不到:傳入畸形數據 (安全漏洞) |
Parcelable encountered ClassNotFoundException reading a Serializable object(name =某個類名稱) | 1.因爲正APP中使用getSeriaizableExtra() 的 api, APP開發人員沒有對傳入的數據作異常判斷,別的有企圖的人能夠經過傳入畸形數據,致使本地拒絕服務 2.傳入簡單數據,好比Integer ,就會拋出類型轉換異常classCastException 2.當傳入自定義的可序列化對象時,就會拋出上述帶有ClassNotException 的異常信息 |
||
反序列化時出錯 | Could not read input channel file description from parcel | 通常是由於Intent 傳遞的數據太大 ,貌似大於1MB 就會崩潰。也有多是fileDescripter太多並且沒有關閉 ,或者looper太多沒有退出致使的 | ||
列表相關異常 |
||||
adpter數據變化可是沒有通知listview | adapter的內容變化了 ,可是相應的listview並不知情 | 1.保證adapter的數據在在主線程中修改 2.及時的調用notifyDataSetChange方法 |
||
listview滾動時點擊刷新按鈕後崩潰 | 滾動時調用getCount ,回調用getView,這時將數據clear了 。會報IndexOutOfBoundsException:Invalid index 30 ,size is 1 ; | 在listview滾動時將刷新按鈕設置爲不可點擊 |
||
Abslilstview 的obtainView 返回空指針 。 | Abslilstview 的obtainView 方法獲取不到view ,其緣由在於getview方法在某些時候返回null | getView的第二個常數convertView是不會爲null ; 在getView返回值得時候,判斷一下是否爲null ,若是爲null ,則放回convertView 。 |
||
Adapter數據源發生變化可是沒有notifyDataSetChanged | pageAdapter對於notifyDataSetChanged()和getCount()的執行順序是很是嚴格的才,系統跟蹤count的值 ,若是這個值和getCount返回值不一致,就會拋出這個異常 。 | 爲了保證getCount老是返回一個正確的值 ,那麼在初始化viewpage時應該先給adapter初始化內容後再將該adapter傳遞給viewpage ,若是不這樣處理 ,在更新adapter的內容後 ,應該調用一下adapter的 notifyDataSetChanged 。 | ||
窗體相關的異常:基本上都是dissmiss方法銷燬對話框的時候 ,activty已經不存在。 |
||||
窗口句柄泄露 | 非主線程中的某些操做不當而引發的異常,從而致使強制關閉當前activity。而還未及時的調用dismss來解除Dialog等引用 。 | 在onDestroy()方法中調用dismiss來解除對dialog的引用 。 dialog.dismiss() ; |
||
view not attached to widow manager | 在一個費時的線程,在任務開始時顯示對話框,任務結束時再銷燬對話框,在期間若是activity由於某種緣由有從新啓動,那麼Dialog調度dismiss方法的時候windowManager檢查發現Dialog所屬Activity已經不存在,因此會報 view not attached to widow manager |
要正確使用對話框 , (1)不要在非UI線程中使用對話框建立顯示和取消對話框 。,那麼對於異步操做顯示對話框怎麼辦? Activty都要有相應的操做對話框回調 ,好比: .onCreateDialog .showDialog .dimissDialog .removeDialog . (2)必定要讓對話框對象在activty的可控制範圍內核生命週期以內。如對話框必定要是Activty的成員變量,而且再讓對話框變量活躍在activty的Oncreat和OnDestory的方法之間 。 |
||
窗體在不恰當的時候獲取了焦點。 | 在popoupWindow顯示以前,就把焦點賦予它。 通常發生在Android2.3時出現 |
進行兼容。。。 |
||
token null is not for an application | 在實現Android浮窗時 ,Context不正確 AlertDialog.Builder(mcontext)所接的getAPPAction——Context()獲取的Context,而應該是activty的實例,由於只有一個activty才能添加一個窗體。 |
|||
permission denied for this windown type | 在使用WindowMagnager.Layout.TYPE_SYSTEM_ALERT涉及window type 權限問題 。 | 解救辦法的在配置文件中添加權限 <!---顯示系統窗口權限--> _ALERT_WINDOW <!---在屏幕最頂部顯示addview--> _OVERLAY_WINDOW |
||
is your activty running | 1.當我回來,你已不在 。這種Crash 與彈窗密切相關 ,因爲 。 2.在 onCreate 方法中 ,想要彈出PopupWindow,當參數parent爲空時 ,就會報上述的錯誤,由於PopupWindow依賴於activty ,而activty的OnCreate還沒執行完 ,那麼確定會報錯。 |
2.能夠經過延遲(handle)來實現這個效果。。。 | ||
添加窗體失敗 | ||||
AlertDialog.resolveDialogTheme | 1.在B頁寫了一個show方法 ,控制AlertDialog的彈出和隱藏 。在A頁面卻要調用頁面B頁面的show方法,因而就崩潰了。 2.在TabActivty中切換Tab ,容易產生這個Crash ,由於在new對話框時,參數content指定成了this ,即指向當前子activty的content,可是子activty是動態建立的 ,不能保證一直存在,其父activity的content則是隱藏的,因此將this替換爲getParent()便可, |
1. | ||
this specifiied childed already has a parent | 在使用兒子時要先要調用其父的remove -view 方法,解除父子關係 。 | |||
子線程不能修改UI | ||||
不能再子線程操做AlterDialog和Toast | ||||
資源相關的異常() |
||||
Resources$NotFoundException | 由於參數int resID 錯誤 。咱們把String 賦值給int的ResId ,因此編譯器找不到正確的resource而報錯誤 。 | |||
StackOverefiowError | Layout佈局文件結構嵌套太深 ,咱們應該儘可能控制在5層以上 。要常用Hierarchy View對其進行優化,移除沒必要要的試圖。 在APP退出的時候APP有多個線程,那麼在退出APP的時候可能不能徹底關閉APP,及時使用finish方法也沒法作到 ,必須使用System.exit(0)這樣的語句才能夠。這是由於finish方法只能退出當前的activity ,可是還有其餘activty未關閉,這些activty中沒有結束的線程,從而還有一些資源沒有釋放。而exit(int code)方法可使進程退出能保證把全部的線程的棧空間釋放,不然會有線程殘留空間沒法釋放從而沒法回收。將會致使該進程新建時棧空間不足,從而發生StackOverefiowError異常。 |
不管哪一種StackOverefiowError異常都是因爲無線遞歸引發的,在JVM中有一個棧,預設了一個深度,當超出這個深度時就會拋出StackOverefiowError。 | ||
unstatisfiedLinkError | .so格式的文件沒有加載到 ,檢查libs的aremeabi目錄下的.so文件是否存在 。不能只看aremeabi 還要看x86下.so文件是否存在,若是沒有,在x86的設備上依然是加載不到的。 | cpu指令集在Android aremeabi aremeabi-v7a mips 和 x86 ,因此處理so文件要格外當心 。 aremeabi 與 aremeabi-v7a 的so數量不一致,是典型的會致使UnsatisfiedLinkError的場景 |
||
infiateException之FileNotFoundException | GC致使 ,activty被銷燬但涉及的資源沒有被回收,便產生內存泄露,可是表現爲FileNotFoundException | 在activty的onStop方法中手動釋放每一張圖片的資源 | ||
infiateException之缺乏構造器 | 在建立自定義View的時候,會可能產生。 是其中第二個參數用來將xml文件中的屬性初始化。 |
在自定義控件若須要xml文件中使用,就必須重寫帶上兩個參數的構造方法 。 | ||
infiateException之style與android:textstyle的區別 | style中定義 要用 style=「@style/NomalText」 | |||
TransactionTooLargeException | Binder最大一般爲1MB ,若是大於1MB就會拋出TransactionTooLargeException 異常 。 這個異常常常出如今圖片的分享功能中。 在採集打點數據時也會看到這類異常 ,(數據積累到必定量後才發生的) |
不要將大量的數據傳入Binder 不如說圖片 | ||
系統碎片化化異常(一是版本差別 二是不一樣的ROM) |
||||
NosuchMethodError | java.lang.NoSuchMethErroor | 方法被放棄,謹慎使用 。 | 在開發階段Android Lint,裏面又被廢棄方法的警告。 若是使用要進行Android 系統版本的判斷。 int sysVersion =Integer.paresInt(android.os.Build.VERDION.SDK) ; if..... |
|
RemoteViews | android.widget.RemoteView$Refiection.writeToParcel(Remote.java:763) | RemoteViews使用的地方有兩個 , APPWidget ,Notification。對於APP類而言有機會用到的是後者。 Notification 有一個contentView屬性,就是RemoteView類型 。給imageview設置圖片 textVie 綁定資源ID 。 |
異常:當Bitmap爲null時 當你的string 爲""或者爲null Android版本是4.1時 不會出現以上狀況。只會表現出異常並不會大體程序崩潰 。 |
|
pointerIndex out of range | java.lang.IllegalArgumentException:pointerIndex out of rangeat android view .motionEvent.nationGetAxiValue(Native Method) | 在作多點觸控放大縮小,操做本身所繪製的圖形時發生這個異常,若是是操做圖片的方法縮小,多點觸控不會出現這個錯誤 。這個bug是Android系統緣由致使的,因此簡單有效的辦法是在繪製時捕獲這個異常 。 在用viewpage的話 ,onInterceptTouchEvent返回false 會致使viewpage翻頁出現bug 。 方法一: public fioat spacing (MotionEvent event){ try{ x =event.getX(0) -event.getX(i) ; y=event.get(0)-event.getY(i); }catch(IllegalArgumentException){ e.printStackTrance() ; } } |
方法二:1.讓view建立一個子view繼承自它們中的某一個。 2.重寫這個 view的onInterceptTouchEvent和onTouchEvent 3.爲上述這個兩個方法增長try。。catch語句,捕獲已知的異常 。 try{ super.onIntercepttouchEvent(MotionEvent ev) }catch(IllegalArgumentException){ e.printStackTrance() ; } try{ super.onTouchEvent(MotionEvent ev) }catch(IllegalArgumentException){ e.printStackTrance() ; } 至少在4.1 上是好用的。 |
|
securityException 之一 Intent中的圖片太大 | 在跳轉的extra中有bitmap應該減小要傳輸的圖片的體積大小,或者經過保存圖片的SD卡中或者經過URI方式傳遞圖片參數,不然,圖片太大,就會有上述錯誤。1MB是一個臨界點 。 | |||
SecurityException 之二 動態加載其餘的apk的activity 。 | 若是在apk中動態的註冊Broadcast ,那麼Launcher動態加載該apk時 ,就有可能出現java.lang.secuityException異常 | 修改以前註冊的BroadcastReceiver的地方 ,經過ContextHOder()來=註冊BroadcastReceiver ,把apk從新部署驗證便可 。 | ||
SecurityException 之三 No permission to modify thread | App常常會申請一些權限 ,而有些手機的ROM處於安全考慮,會禁止這些權限 ,那麼當APP使用這些權限時 ,就會發生崩潰 。 | 在執行某些安全相關的操做時 ,要麼加if語句跳過要麼使用try...catch.. 捕獲這類異常 ,寧可點擊無效也不能崩潰 。如電話撥打 有些手機會禁止 。即便在功能清單文件中配置了頁不行 ,咱們要先判斷是否有打電話的權限,以確保不發生崩潰 。 | ||
view的getDrawingCache()返回null | 當背景圖太大,超過屏幕的大小 ,就致使getDrawingCache()返回的結果是null ,從而拋出NullPointEXception 異常 | 控制圖片的大小 ,剪裁或者等比縮放 。 | ||
DeadObjectException | ||||
anderoid 2.1 不支持SSL | 版本判斷 | |||
viewFlipper | 橫豎屏切換引起的異常是因爲onDetachedFromWindow()在onAttachedToWindow() ; | 重寫viewFlipper的OnDetachedFromWindow()方法 |
||
ActivtyNotFoundException | 發生在4.0 以上出現 。緣由 ,是4.0 以上用來的網絡設置方式捨棄了 。 |
|||
Android2.2 不支持xlargeScreens | NO resource identifier found for attribute ‘xlargeScreens’in package ‘Android’ | 在功能清單文件中supports-scress標記中 ,緣由xlargeScreens 屬性在API9(2.3)中才支持 。 | ||
package manager has died | Package manager has died at android.app.applicationPackageManager.getApplication(ApplicationPackageManager.java..) | |||
spannableString 與富文本字符串 | ||||
can not perfform this action after onSaveInstanceState | commit方法在activity的OnSaveInstanceState()以後調用 ,由於。。。 | |||
service Intent must be explicit | service Intent must be explicit | 在5.0系統後會產生這樣的崩潰 ,直接經過action啓動service ,就會致使這個問題 ,必須指定component 或者package 才能避免這類問題 。 | ||
SqLite相關異常 |
||||
No transaction is active | ||||
忘記關閉Cursor | ||||
數據庫被鎖定 | ||||
試圖再打開已經關閉的對象 | ||||
文件加密了或無數據庫 | ||||
webview中的Sqlite 緩存致使的崩潰 | ||||
webview中的cache數據 | ||||
磁盤讀寫錯誤 | ||||
android_metadata表不存在 | ||||
android_metadate表中的locale字段 | ||||
數據庫或者磁盤滿了 | ||||
不明錯誤 |
||||
內存溢出 | ||||
verify Failed | ||||
TimeOutException | ||||
json 解析異常 | ||||
jsonArray在初始化時爲空 | ||||
第三方SDK 拋出的crash | ||||
兩個不一樣類型的view有相同的id | ||||
LayoutInfiater.from().infitate()使用不當致使的崩潰 | ||||
viewgroup | ||||
monkey點擊過快致使的崩潰 | ||||
圖片縮放不少倍 | ||||
圖片寬度爲0 | ||||
不能重複添加組件 | ||||