異常:就是程式在運行時出現不正常情況。
分類:Error;Exception
異常的處理:常見的操作e.getmessage()、e.toString()、e.printStackTrace()
java 提供了特有的語句進行處理:
try {
需要被檢測的代碼;
} catch(異常類 變數) {
處理異常的代碼;(處理方式) //這邊要是有retur語句後面將不被執行
} finally {
一定會執行的語句; 當執行到System.exit(0);fianlly不會執行。
}
異常的申明:
明異常時,建議聲明更為具體的異常。這樣處理的可以更具體。
對方聲明幾個異常,就對應有幾個catch塊。不要定義多餘的catch塊。 這裡需要注意的是如果其中一個異常申明的是父類的異常(Exception e)異常,呢麼它一定要放在最後面,否則的話定義的其他異常將不能被運行。
自訂異常:
異常的好處:將問題進行了封裝; 將正常流程代碼和問題處理代碼相分離,方便與閱讀。
class FuShuException extends Exception //getMessage(); { 這就是自訂了一個異常。
//private int value;
//FuShuException() {
// super();
//}
FuShuException(String msg,int value)
{ 這邊是在定義異常資訊,父類已經對異常資訊做過處理,子類直接通過super(msg);方法擷取自訂的異常資訊
super(msg);
this.value = value; //這裡可以把異常的數字也列印出來
}
public int getValue() {
return value;
}
}
class Demo {
int div(int a,int b)throws FuShuException { //函數內部拋出了一個自訂的異常,在函數上要申明一下
if(b<0)
throw new FuShuException("出現了除數是負數的情況------ / by fushu",b);//手動通過throw關鍵字拋出一個自訂異常對象。
return a/b;
}
}
class ExceptionDemo3 {
public static void main(String[] args) {
Demo d = new Demo();
try {
int x = d.div(4,-9);
System.out.println("x="+x);
} catch (FuShuException e) {
System.out.println(e.toString());
//System.out.println("除數出現負數了");
System.out.println("錯誤的負數是:"+e.getValue());
}
System.out.println("over");
}
}
繼承Exception的原因:異常體系有一個特點,因為異常和異常對象都不拋出,他們都具備可拋性,這個可拋性是throuable這個體系中的專屬特點,只有這個體系中的類和對象才可以被throw和throws操作。
throws和throw的區別:
throws使用在函數上;throw後跟的是異常對象。
throw使用在函數內;throws後面跟的異常類。可以跟多個。用逗號隔開。
RuntimeException 運行時異常
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過;如果在函數上聲明了該異常。調用者可以不用進行處理。編譯一樣通過;之所以不用在函數聲
明,是因為不需要讓調用者處理。當該異常發生,希望程式停止。因為在運行時,出現了無法繼續運算的情況,希望停止程式後,對代碼進行修正。
自訂異常時:如果該異常的發生,無法在繼續進行運算,就讓自訂異常繼承RuntimeException。
class LanPingException extends Exception {
LanPingException(String message) {
super(message);
}
}
class MaoYanException extends Exception {
MaoYanException(String message) {
super(message);
}
}
class NoPlanException extends Exception {
NoPlanException(String msg) {
super(msg);
}
}
class Computer {
private int state = 3;
public void run()throws LanPingException,MaoYanException {
if(state==2)
throw new LanPingException("藍屏了");
if(state==3)
throw new MaoYanException("冒煙了");
System.out.println("電腦運行");
}
public void reset() {
state = 1;
System.out.println("電腦重啟");
}
}
class Teacher {
private String name;
private Computer cmpt;
Teacher(String name) {
this.name = name;
cmpt = new Computer();
}
public void prelect()throws NoPlanException {
try {
cmpt.run();
} catch (LanPingException e) {
cmpt.reset();
} catch (MaoYanException e) {
test();
throw new NoPlanException("課時無法繼續"+e.getMessage());
}
System.out.println("講課");
}
public void test() {
System.out.println("練習");
}
}
class ExceptionTest
{
public static void main(String[] args)
{
Teacher t = new Teacher("畢老師");
try
{
t.prelect();
}
catch (NoPlanException e)
{
System.out.println(e.toString());
System.out.println("換老師或者放假");
}
}
}
異常在子父類中覆蓋的體現:
1)子類在覆蓋父類時,如果父類的方法拋出異常,那麼子類的覆蓋方法,只能拋出父類的異常或該異常的子類。
(父類已經有問題,子類要繼承父類的功能,不能比父類更有問題,只能更最佳化
2)父類拋出多個異常,那麼子類在覆蓋該方法時,只能拋出父類異常的子集(只要父類能處理)。
3)如果父類或介面的方法中沒有拋出異常,那麼子類在覆蓋方法時也不可以拋出,只能try,絕對不能拋。
包(package):
對類進行分類管理;給類提供多層命名空間;寫在程式第一行;類的全名是:包名.類名;包也是一種封裝,建包可以將源檔案和類檔案分離。算是一種加密,保護
原始碼被偷窺。
包與包之間可以使用的許可權,只有public和protected兩種。
public protected default private
同一個類中 ok ok ok ok
同一個包中 ok ok ok
子類 ok ok
不同包中 ok
導包:使用import關鍵字