Android開發中的常見異常
***********************************************************************************************************************************************************************************
記得之前學習的時候,聽一些技術大牛說過,一套好的程式不是編出來的,而是調出來的,調的是什麼呢,就是bug,異常,後來在工作之後,隨著接觸的應用專案不斷增多,也越來越明白這句話的正確性。今天就把自己在開發中所遇到的一些異常列舉出來,和大家分享,有哪些理解不到位的地方,希望大家可以多提意見。
首先先說一下什麼是異常機制,異常機制是指當程式出現錯誤後,程式如何處理。具體的說,異常機制提供了程式退出的安全通道。當出現錯誤後,程式執行的流程發生改變,程式的控制權轉移到異常處理器。
a.空指標異常 java.lang.NullPointerException
有物件的宣告, 卻沒有給物件在堆中開闢記憶體,這時當呼叫物件的屬性或方法就會丟擲該異常
b.強制轉換異常java.lang.ClassCastException
需要轉換的物件與向上或者向下轉換的例項沒有關係的時候,強制轉換會報此異常,比如
ListView listView = (ListView)findViewById(R.id.textview);
通過findViewById()方法,找到的是一個TextView物件,返回的是一個view物件,但向下轉型的目的例項與TextView不是一類,所以會報異常.
c.下角標越界異常java.lang.ArrayIndexOutOfBoundsException
我們都知道,我們可以通過一個指定的容器(如陣列或者集合)的角標來對該容器進行增刪改查操作,當你需要的角標數值不在指定的容器中時,就會報出此異常。比如一個裡面有10個例項的集合,如果你呼叫的角標不在0~9這個範圍內的話就會報此異常。
d.轉換類異常 java.lang.ClassNotFoundException
轉換的目的類不存在就會導致此異常產生
e.記憶體不足 java.lang.OutOfMemoryError
當執行一個程式的時候,手機的可用記憶體不足以讓java虛擬機器給一個物件記憶體空間時
f.棧溢位錯誤 java.lang.StackOverflowError
應用的遞迴呼叫的層次太深而導致堆疊溢位時丟擲該錯誤,會直接導致程式崩潰。
g.算數異常 java.lang.ArithmeticException
呼叫除法運演算法則,除數為零的話,就會報此異常
h. 非法訪問異常 java.lang.IllegalAccessException
應用通過反射方式建立某個類的例項、訪問該類屬性、呼叫該類方法,但是又沒有訪問類的屬性、方法的構造方法定義時
例如,你定義的某個包的類的許可權為protected,當其他的包下的類需要訪問時,又因為沒有這個許可權,就會丟擲此異常
i. 沒有這個方法 java.lang.NoSuchMethodException
呼叫某個類不存在的方法時,丟擲此異常
g.沒有這個屬性 java.lang.NoSuchFieldException
呼叫某個類不存在的屬性時,丟擲此異常
k. 數字格式異常 java.lang.NumberFormatException
被轉換的資料不能滿足指定資料型別出現此異常,如(int 轉換為字串,boolean轉換為字串)
既然程式有bug,就需要修改bug,這時當程式寫了無數行程式碼,再因為其中的一個bug逐行找問題就顯得很費事了,我一般是用debug除錯,下面就把debug除錯的方法順便寫一下:
1)在你感覺可能出現問題的地方打個斷點,就是在行號的左側藍顏色處雙擊,
2)打上斷點後就可以執行專案了,執行的方式有兩種:
a.在專案名稱上右擊---->Debug As --->Android Application 就可以運行了
b.工具欄上方有Run這一項,點選Run --> Debug As --選擇執行的專案即可
3)當專案執行到斷點時,
下面如果把88行的程式碼註釋掉,debug執行在看:
可以看到debug調試出來的89行的變數為null,也就是空指標Exception!
另外介紹它的兩個小用法:
point1.點選工具欄的紅色按鈕可以終止debug執行模式:
point2.看下面這張圖,有兩個紅色箭頭所指的黑色叉號,如果你在整個專案的不同類中打了n多個斷點,想要馬上全部取消的話,點選有兩個黑色叉號的按鈕即可;如果想一個一個取消斷點的話,就先選中斷點所在的行,如下圖,然後再點有一個叉號的按鈕
這就是debug的用法了!
***********************************************************************************************************************************************************************************