JAVA學習第十八課(異常及其思想 (一) )
來源:程序員人生 發(fā)布時間:2014-10-09 07:16:57 閱讀次數(shù):3192次
異常:重要知識點
異常處理的代碼簡單,重要還是理解其思想
一.概述:
異常就是在運行時發(fā)生的不正常情況
Throwable:
Error
通常出現(xiàn)重大問題如,運行的類不存在或者內(nèi)存溢出等
不編寫針對代碼對其處理
Exception
在運行時運行出現(xiàn)的一起情況,可以通過trt catch finally
Exception和Error的子類名都是以父類名作為后綴
異常舉例:數(shù)組越界、傳遞參數(shù)錯誤啊。。。
class Futime
{
}
class Bigtime
{
}
public class Main
{
public static void main(String[] args)
{
/*int[] a = new int[5];
* a = null;
System.out.println(a[5]);//異常
*/
sleep(-5);
}
/*public static void sleep(int t)
{
if(t<0)
{
//數(shù)據(jù)出錯,處理辦法
//數(shù)據(jù)出錯,處理辦法
//數(shù)據(jù)出錯,處理辦法
//.....閱讀性差
修正見下
}
else if(t>10000)
{
//數(shù)據(jù)出錯,處理辦法
//數(shù)據(jù)出錯,處理辦法
//數(shù)據(jù)出錯,處理辦法
new Bigtime();
}
else {
System.out.print("休息"+t+"分種");
}
}*/
public static void sleep(int t)//這樣就清晰很多
{
if(t<0)//但是注意就有個問題,誰在調(diào)用這個功能,如何收到異常呢
{//采用拋出的方式
拋出 new Futime();//代表時間為負情況,這個對象中包含著問的名稱,信息,位置等信息
}
else if(t>10000)//比如:我感冒了
{
拋出 new Bigtime();//C是吃藥,上醫(yī)院...,而java就可以理解找治感冒的方法
}
else {
System.out.print("休息"+t+"分種");
}
}
}
*
* 這就體現(xiàn)出JAVA和c的不同,C是用if判斷然后寫諸多的解決方法,而java中是用
* 類的形式對不正常的情況進行了描述和封裝對象
* 描述不正常的情況的類,就稱為異常類
* 以前正常流程代碼和問題處理代碼相結合
* 現(xiàn)在將正常流程代碼和問題處理代碼相分離,提高閱讀性
* 其實異常就是java通過面向對象的思想將問題封裝成了對象
* 用異常類對其進行描述
*
* 總結一句話就是不同的問題用不同的類進行具體的描述,比如角標越界,空指針
*
二.異常體系
如果問題很多就意味著描述的類以前很多
將其共性進行向上抽取,就形成了異常體系
最終問題(不正常情況)就分成了兩大類
Throwable://無論是error,還是異常問題,問題發(fā)生就應該可以拋出,讓調(diào)用者知道并處理 ->可拋性
(父類下面有兩大派 )
1.一般不可處理的。用Error類表示
2.可以處理的。用Exception
體系特點:
Throwable及其所有子類都具有可拋性,不是這體系的不行
如何體現(xiàn)可拋性?
通過兩個關鍵字:throws和throw,凡是被這兩個關鍵字所操作的類和對象都具備可拋性
(Error和Exception類似于疾病,可以治愈的,和不可以治愈的)
Error:
特點:是由JVM拋出的嚴重性的問題,已經(jīng)影響到程序的運行了
這種問題的發(fā)生一般不針對性處理,因為處理不了,直接修改程序(int[] a = new int[1024*1024*800],開辟一個800M的數(shù)組)
Exception的直接子類很多,Error的直接子類不多,但是都是不可處理的,比較狠
體系的特點:
子類的后綴名都是用其父類名作為后綴,閱讀性強,比如OutOfMemoryError
三、原理及其異常對象的拋出

小演示:
class ExceptionDemo
{
public int method(int[] arr,int index)
{
if(arr==null)
throw new NullPointerException("數(shù)組引用怎么能為空呢?");
if(index>=arr.length)
{
//return -1;為什么不寫return,因為跟本就不運算
throw new ArrayIndexOutOfBoundsException("數(shù)組角標越界"+index);
//throw new ArrayIndexOutOfBoundsException(""+index);//默認的
}
if(index<0)
{
throw new ArrayIndexOutOfBoundsException("數(shù)組角標不能為負"+index);
}
return arr[index];
}
}
public class Main
{
public static void main(String[] args)
{
int[] a = new int[10];
ExceptionDemo C = new ExceptionDemo();
int num = C.method(a,20);
//int num = C.method(null,2);
System.out.print("num"+num);
}
}
四、自定義異常類及其拋出
類似于負數(shù)角標異常這種情況在java中并沒有定義,那就可以按照java異常的創(chuàng)建思想,將負數(shù)角標異常這情況進行自定義描述,并封裝稱對象(自定義異常)
PS:如果讓一個類稱為異常類,那么這個類必須繼承異常體系,只有異常體系的子類才具備可拋性,才可以被throw,throws兩個關鍵字操作
class FuException extends Exception
{
FuException()
{
}
}
//定義一個異常后,需要告訴調(diào)用者可能出現(xiàn)的問題
class ExceptionDemo
{//要么捕捉,要么拋出
public int method(int[] arr,int index) throws FuException
{
if(index<0)
{
throw new FuException();
}
return arr[index];
}
}
public class Main
{
public static void main(String[] args)throws FuException
{
int[] a = new int[10];
ExceptionDemo C = new ExceptionDemo();
int num = C.method(a,-2);
System.out.print("num"+num);
}
}
上述兩個throws就對應了以上圖示
五、編譯時檢測異常和運行時異常的區(qū)別
異常的分類:
1.編譯時被檢測異常:只要是Exception和其子類都是,除了特殊子類RuntimeException體系
ps:這種問題一旦出現(xiàn),希望在編譯時就進行檢測,讓這種問題有對應的處理方式,這樣的問題都可以針對性的處理
2.編譯時不檢測異常(運行時異常):就是RuntimeException和其子類->編譯器根本就不檢測這個體系
ps:這種問題的發(fā)生無法讓功能繼續(xù),運算無法進行,更多是因為調(diào)用者的原因導致的或者引發(fā)了內(nèi)部狀態(tài)的改變導致的
那么這種問題一般不處理,直接編譯通過,在運行時,讓調(diào)用者調(diào)用的程序強制停止,讓調(diào)用者對代碼修改
(開發(fā)常碰見的異常)
所以自定義異常時,要么定義Exception,要么RuntimeException
throw和throws的區(qū)別
1.throws使用在函數(shù)上
throw使用在函數(shù)內(nèi)
2.throws拋出的是異常類,可以拋出多個,用逗號隔開
throw拋出的是對象
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈