------- android培訓、java培訓、期待與您交流! ----------
一 異常
1 異常:程序運行時的不正常,java將這些異常封裝成了對象
(1)作用:將問題進行封裝,將正常流程代碼和問題處理代碼相分離
(2)異常分爲兩大體系,Error和Exception,其父類是Throwable。
其中,Error是嚴重的異常,一般不編寫針對的處理代碼。Exception是非嚴重的異常,可編寫針對性的代碼進行處理。
(3)父類Throwable類中定義的是所有異常的共性方法。
方法摘要:
getMessage() 獲取異常信息
toString() 獲取異常類名和異常信息
printStackTrace()獲取異常類名和異常信息,以及異常出現在程序中的位置
2 異常的處理
(1)java虛擬機本身有異常處理機制,如果程序發生異常,java虛擬機會拋出異常信息並使程序停止
(2)java提供的處理異常語句
try
{
需要被檢查的代碼;
}
catch(異常類 變量)
{
處理異常的代碼;
}
finally
{
一定會執行的語句;//一般用於關閉資源
}
(3)還有兩種格式try{} catch(){}
try{} finally{}
3 throws和throw
(1)throws關鍵字用於在方法上標明該方法可能會發生某類異常
(2)聲明異常時,建議聲明更爲具體的異常,這樣處理的更爲具體
(3)如果調用者調用了在方法上標明throws的方法,調用者必須處理該異常或者在自己所在的函數上聲明異常
(4)throw關鍵字用於在方法內手動拋出異常對象
(5)throw和throws的區別:
throws定義在函數上,後面跟異常類,可以多個,用於聲明該函數可能發生某類異常。
throw定義在函數內,後面跟異常對象,用於拋出異常對象。
4 多異常處理
(1)如果方法上聲明瞭多個異常,那麼調用者應該定義多個對應的catch塊
(2)如果多個catch塊存在繼承關係,那麼父類的catch塊放在最下面
下面通過一個例子說明:
class Demo
{
public static void main(String[] args)
{
ExceptionDemo ed=new ExceptionDemo();
try
{
//該方法上throws了異常,調用該方法需要處理或在主函數上聲明,這裏用的是try處理
ed.show(1);
}
catch (ArrayIndexOutOfBoundsException e)
{
//如果真的發生ArrayIndexOutOfBoundsException異常,會執行該語句.不發生異常該語句不會執行
System.out.println("角標越界啦");
}
catch (ArithmeticException e)
{
//如果真的發生ArithmeticException異常,會執行該語句.不發生異常該語句不會執行
System.out.println("除以0啦");
}
catch (Exception e)
{
//因爲Exception是他們的父類都能接受,所以應該放在最下面。
//但是不建議用,因爲這樣的話很容易將問題隱藏掉
System.out.println("除以0啦");
}
finally
{
System.out.println("over");//不管有沒有異常發生都會執行
}
}
}
class ExceptionDemo
{
//在方法上聲明可能會發生數組角標越界異常和算數運算異常
public void show(int x) throws ArrayIndexOutOfBoundsException,ArithmeticException
{
int[] arr=new int[4];
System.out.println(arr[3]);
int y=10/x;
System.out.println(y);
}
}
5 自定義異常
(1)在我們做項目時,當我們所描述的問題java沒有進行封裝時,我們可以將自己的問題進行封裝對象。
(2)自定義異常時,應該繼承Exception或RuntimeException,讓其類繼承java異常體系,具備可拋性以及使用體系的共性方法。
(3)如果方法中出現通過throw拋出的異常時,一般情況下,應當在函數上聲明異常(RuntimeException及其子類除外)
6 RuntimeException類
(1)RuntimeException是Exception的一個特殊子類,是運行時異常
(2)當函數拋出RuntimeException以及其子類時,函數上可以不用聲明,調用者也可以不用處理
(3)該異常發生是因爲亂傳數據而導致的,所以必須讓程序停下來由程序員修改代碼
舉例說明:
//定義一個長方形類
class ChangFangXing
{
private double len;
private double wid;
//初始化長和寬
ChangFangXing(double len,double wid)
{
//判斷長和寬,如果小於0就拋出異常程序結束
if(len<=0||wid<=0)
throw new NoFuShuException("長或寬不大於0,不是個長方形,無法求面積");
else
{
this.len=len;
this.wid=wid;
}
}
//返回面積
public double area()
{
return len*wid;
}
}
//自定義一個異常類繼承RuntimeException成爲運行時異常
//讓程序一發生異常就程序停止
class NoFuShuException extends RuntimeException
{
NoFuShuException(String msg)
{
super(msg);
}
}
class RuntimeExceptionDemo
{
public static void main(String[] args) //主函數
{
//創建長方形對象,在這裏不try處理
//因爲如果程序發生異常是因爲調用者誤傳參數導致的,所以需要讓程序停止,有程序員修改
ChangFangXing cfx=new ChangFangXing(3.0,-4.0);
//程序如果發生異常,下面語句不執行
double a=cfx.area();
System.out.println(a);
}
}
7 對於異常,分兩種
(1)編譯時被檢測的異常,
(2)編譯時不被檢查的異常,運行時異常,也就是RuntimeException及其子類
8 finally代碼塊
(1)finally代碼塊裏面定義的是一定會執行的語句。包括前面讀到return語句。
(2)finally有一種情況不會被執行到,就是讀到System.exit(0);
(2)通常用於關閉資源
9 異常在子父類覆蓋的體現
(1)子類覆蓋父類方法時,父類方法拋出異常,那麼子類只能拋出該異常或該異常的子類
(2)子類覆蓋父類方法時,父類拋出多個異常,子類只能拋出多個異常的子集
(3)子類覆蓋父類方法時,父類沒有拋出異常,子類也不能拋出異常,如果子類方法發生異常,只能內部處理
總結就是:父類沒有異常,之類不能有異常。父類就算有,子類不能比他多,子類有隻能是父類異常本身或該異常的子類
二 包(package)
1 概述:對類進行分類管理,爲類提供多層命名空間,包也是封裝的一種形式。必須寫在程序的第一行
2 作用:可以以將源文件與class文件分離,提供安全性。
3 package和import關鍵字
package用來標識class文件所屬的包,後面加包名,一般包名全部小寫,必須放在程序的第一行。如:package pack;
import用於導入某個包裏的類文件,後面可以加包名.class文件名(代表導入具體的某個類),也可以加包名.*(代表導入某個包的全部類文件)
4 一個包中的類要被訪問,要有足夠大的權限,所以被訪問的類要被public修飾,以及成員也要被public修飾。
(1)protected(保護權限):不同包中的子類可以直接訪問父類中被protected修飾的成員。
(2)包與包之間可以使用的權限只有兩種,public和protected