異常分析 (空間過小)

  1. 出現 異常的緣由:
  2. 碎片化 。
  3. MobileAPI髒數據
  4. 混淆時沒有Keep 要使用的類或者方法  。 
 
  本地開發要與線上分開  
 異常信息中提示  「方法名」unknown source 內容 ,會加大咱們準肯定位的crash的難度 。
 致使 unknown source 的緣由
    1.執行javac時丟失文件名和行號 
       咱們要在javac編譯時保留debug信息  <javac  debug="true" debuglevel="source ,line" ....>
   2. 執行了代碼混淆丟失文件名個行號
       在proguard文件中增長  -keeparttributes  SourceFile,LineNumberTable
 
 
 
 
名稱  關鍵字  發生頻率 發生緣由 解決方式
名稱  關鍵字 發生頻率 發生場景 解決方式
 空指針 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        
不能重複添加組件        
         



相關文章
相關標籤/搜索