異常的繼承結(jié)構(gòu):
基類為Throwable返弹,Error和Exception繼承Throwable抽碌,RuntimeException和IOException等繼承Exception翰铡,具體的RuntimeException繼承RuntimeException。
Error和RuntimeException及其子類成為未檢查異常(unchecked)已添,其它異常成為已檢查異常(checked)拦坠。
1、 SQLException:操作數(shù)據(jù)庫異常類萨惑。
問題:當(dāng)Java應(yīng)用程序與數(shù)據(jù)庫進(jìn)行溝通時(shí)如果產(chǎn)生了錯(cuò)誤捐康,就會(huì)觸發(fā)這個(gè)類。同時(shí)會(huì)將數(shù)據(jù)庫的錯(cuò)誤信息通過這個(gè)類顯示給用戶庸蔼。當(dāng)用戶插入數(shù)據(jù)的時(shí)候解总,如果這個(gè)字段的值跟現(xiàn)有的紀(jì)錄重復(fù)了,違反了數(shù)據(jù)庫的唯一性約束姐仅,此時(shí)數(shù)據(jù)庫就會(huì)跑出一個(gè)異常信息花枫。這個(gè)信息一般用戶可能看不到,因?yàn)槠浒l(fā)生在數(shù)據(jù)庫層面的掏膏。此時(shí)這個(gè)操作數(shù)據(jù)庫異常類就會(huì)捕捉到數(shù)據(jù)庫的這個(gè)異常信息劳翰,并將這個(gè)異常信息傳遞到前臺(tái)。如此的話馒疹,前臺(tái)用戶就可以根據(jù)這個(gè)異常信息來分析發(fā)生錯(cuò)誤的原因佳簸。
解決方案:檢查插入的數(shù)據(jù)是否重復(fù)。
2颖变、 ClassCastException:數(shù)據(jù)類型轉(zhuǎn)換異常生均。
問題:在Java應(yīng)用程序中,有時(shí)候需要對(duì)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換腥刹。這個(gè)轉(zhuǎn)換包括顯示的轉(zhuǎn)換與隱式的轉(zhuǎn)換马胧。不過無論怎么轉(zhuǎn)換,都必須要符合一個(gè)前提的條件衔峰,即數(shù)據(jù)類型的兼容性漓雅。在數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換之前,就保證數(shù)據(jù)類型的兼容性朽色。如此的話邻吞,就不容易造成數(shù)據(jù)類型的轉(zhuǎn)換異常。如在只允許數(shù)值類型的字段中葫男,可以設(shè)置不允許用戶輸入數(shù)值以外的字符抱冷。
解決方案:注意相應(yīng)的組件在初始化的時(shí)候,是否相對(duì)應(yīng)梢褐。
3旺遮、 NumberFormatException:字符串轉(zhuǎn)換為數(shù)字類型時(shí)拋出的異常赵讯。
在數(shù)據(jù)類型轉(zhuǎn)換過程中,如果是字符型轉(zhuǎn)換為數(shù)字型過程中出現(xiàn)的問題耿眉,對(duì)于這個(gè)異常在Java程序中采用了一個(gè)獨(dú)立的異常边翼,即NumberFormatException.如現(xiàn)在講字符型的數(shù)據(jù)“123456”轉(zhuǎn)換為數(shù)值型數(shù)據(jù)時(shí),是允許的鸣剪。但是如果字符型數(shù)據(jù)中包含了非數(shù)字型的字符组底,如123#56畜晰,此時(shí)轉(zhuǎn)換為數(shù)值型時(shí)就會(huì)出現(xiàn)異常淀弹。系統(tǒng)就會(huì)捕捉到這個(gè)異常,并進(jìn)行處理庸论。
解決方案:檢查數(shù)據(jù)是否正確铛纬。
- java.lang.NullPointerException
(1).如果使用第三包的jar包厌均,jar包中有錯(cuò)誤
(2).沒有實(shí)例化組件
(3).沒有把Adapter和值綁定;
(4).當(dāng)頁面中某個(gè)組件賦值為null時(shí)activity會(huì)出現(xiàn)錯(cuò)誤告唆,程序崩潰后其他頁面的數(shù)據(jù)就會(huì)被重新初始化
(5).用Intent傳值時(shí)棺弊,獲取的key不存在
(6).沒有賦初始值
- java.lang.ClassNotFoundException 異常的解釋是"指定的類不存在"。
- java.lang.ArithmeticException 這個(gè)異常的解釋是"數(shù)學(xué)運(yùn)算異常"擒悬,比如程序中出現(xiàn)了除以零這樣的運(yùn)算就會(huì)出這樣的異常镊屎。
- java.lang.ArrayIndexOutOfBoundsException
異常的解釋是"數(shù)組下標(biāo)越界",現(xiàn)在程序中大多都有對(duì)數(shù)組的操作茄螃,因此在調(diào)用數(shù)組的時(shí)候一定要認(rèn)真檢查缝驳,看自己調(diào)用的下標(biāo)是不是超出了數(shù)組的范圍,一般來說归苍,顯示(即直接用常數(shù)當(dāng)下標(biāo))調(diào)用不太容易出這樣的錯(cuò)用狱,但隱式(即用變量表示下標(biāo))調(diào)用就經(jīng)常出錯(cuò)了,還有一種情況拼弃,是程序中定義的數(shù)組的長(zhǎng)度是通過某些特定方法決定的夏伊,不是事先聲明的,這個(gè)時(shí)候吻氧,最好先查看一下數(shù)組的length溺忧,以免出現(xiàn)這個(gè)異常。 - java.lang.IllegalArgumentException
這個(gè)異常的解釋是"方法的參數(shù)錯(cuò)誤"盯孙,比如g.setColor(int red,int green,int blue)這個(gè)方法中的三個(gè)值鲁森,如果有超過255的也會(huì)出現(xiàn)這個(gè)異常,因此一旦發(fā)現(xiàn)這個(gè)異常振惰,我們要做的歌溉,就是趕緊去檢查一下方法調(diào)用中的參數(shù)傳遞是不是出現(xiàn)了錯(cuò)誤。
- java.lang.IllegalAccessException
這個(gè)異常的解釋是"沒有訪問權(quán)限",當(dāng)應(yīng)用程序要調(diào)用一個(gè)類痛垛,但當(dāng)前的方法即沒有對(duì)該類的訪問權(quán)限便會(huì)出現(xiàn)這個(gè)異常草慧。對(duì)程序中用了Package的情況下要注意這個(gè)異常
10.安全異常:產(chǎn)生的原因是由于當(dāng)前的設(shè)備不支持當(dāng)前程序,這個(gè)是由于機(jī)型產(chǎn)生的問題匙头,我們應(yīng)該換一個(gè)設(shè)備進(jìn)行測(cè)試漫谷,檢測(cè)當(dāng)前程序存在什么樣的異常;另一種原因是獲取激活的網(wǎng)絡(luò)信息實(shí)體類蹂析,需要添加權(quán)限舔示,否則會(huì)出現(xiàn)此異常
解決辦法:在配置文件中,添加android_permission_Access_NetWork_State的權(quán)限
- RejectExcuteException:一個(gè)異步任務(wù)只能執(zhí)行一次识窿,否則會(huì)報(bào)異常
一個(gè)線程最多能執(zhí)行5個(gè)線程,超出則等待脑融,否則會(huì)報(bào)拒絕執(zhí)行的異常
解決辦法:使用子線程+handler來代替AsyncTask喻频,或者一個(gè)線程中少添加幾個(gè)異步操作。
Out of memory:內(nèi)存溢出是存放的數(shù)據(jù)過多導(dǎo)致內(nèi)存不足的溢出事件
Memory leak:內(nèi)存泄露是本應(yīng)該釋放的資源沒有充分得到釋放肘迎,就繼續(xù)添加數(shù)據(jù)導(dǎo)致內(nèi)存泄露事件甥温;
Java應(yīng)用程序中常見的異常類還有很多。如未找到相應(yīng)類異常妓布、不允許訪問某些類異常姻蚓、文件已經(jīng)結(jié)束異常、文件未找到異常匣沼、字段未找到異常等等狰挡。一般系統(tǒng)開發(fā)人員都可以根據(jù)這個(gè)異常名來判斷當(dāng)前異常的類型。
ArithmeticException(除數(shù)為0的異常), BufferOverflowException(緩沖區(qū)上溢異常), BufferUnderflowException(緩沖區(qū)下溢異常), IndexOutOfBoundsException(出界異常), NullPointerException(空指針異常), EmptyStackException(空棧異常), IllegalArgumentException(不合法的參數(shù)異常), NegativeArraySizeException, NoSuchElementException, SecurityException, SystemException, UndeclaredThrowableException