1、理清異常處理的思路:
所有的異常繼承於:Throwable:這個體系的特點:體系中的所有類,以及對象都具備可拋性。
Throwable有兩個直接子類:Error,Exception
Throws用來聲明問題。
throw用拋出問題對象。
try...catch...進行異常捕獲處理。
2、 爲什麼要自定義異常?
有很多異常的子類繼承了Throwable,來描述常用見的異常,但是在實例開發的時候我們會遇到一些Java類庫中沒有描述的異常,這時候就需要我們自定義異常來處理程序中的異常;
我們可以模仿已經在類庫中描述的異常處理的類來自定義異常,首先查AFI文檔,發現Error、Exception各有四個構造方法,沒有直接方法,所以我們在定義異常的時候只要繼承Error、Exception覆蓋其構造方法就能達到自定義異常的效果。用兩個繼承Exceptin的例子說明:
class FuShuException extends Exception//自定義異常,繼承Exception
{
private int num;
FuShuException()//覆蓋空參構造方法
{
super();
}
FuShuException(String meg,int num)//覆蓋傳參構造方法
{
super(meg);//訪問父類中的有參構造函數
this.num = num;
}
public int getNum()
{
return num;
}
}
class Demo
{
int div(int a,int b)throws FuShuException/*聲明自定義的異常*/,ArithmeticException
{
if(b<0)
throw new FuShuException("負數啦,又廢啦!",b);//拋出自定義異常
return a/b;//throw new ArithmeticException();
}
}
class ExceptionDemo4
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int num = d.div(4,0);
System.out.println("num="+num);
}
catch (FuShuException e)//用try...catch...捕獲自定義異常
{
System.out.println(e.toString()+e.getNum());
}
catch (ArithmeticException e)
{
System.out.println(e.toString()+".....");
}
System.out.println("over");
}
}
3、 演示使用自定義異常處理實際開發中的問題:
/*
自定義老師上課時可能出現的異常,以及異常的處理;
以及自定義公司老師上課計劃異常,以及異常處理方案
*/
class LanPingException extends Exception//電腦可能出現藍屏異常
{
LanPingException(String msg)
{
super(msg);
}
}
class MaoYanException extends Exception//電腦可能出現冒煙異常
{
MaoYanException(String msg)
{
super(msg);
}
}
class NoPlanException extends Exception//老師計劃可能有變,無法完成教學計劃
{
NoPlanException(String msg)
{
super(msg);
}
}
class Computer
{
/*
假設三種狀態:state==0、state==1、state==2;
0---電腦正常運行、1---電腦藍屏、2---電腦冒煙
*/
int state=0;
void run()throws LanPingException,MaoYanException//聲明兩個異常
{
if(state==1)//當電腦狀態爲1時,電腦是藍屏狀態
throw new LanPingException("藍屏啦!");//拋出藍屏異常
if(state==2)//當電腦狀態爲2時,電腦是冒煙狀態
throw new MaoYanException("冒煙啦,廢啦!");//拋出冒煙異常
System.out.println("電腦運行!");//電腦正常運行狀態
}
void reset()//電腦重啓函數
{
System.out.println("電腦重啓!");
state=0;//電腦重啓後,改變電腦狀態
}
}
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();
System.out.println("講課!");
}
catch (LanPingException e)//對拋出藍屏異常進行接收
{
System.out.println(e);
cmpt.reset();//處理藍屏異常,重啓電腦
prelect();//電腦重啓後,狀態恢復正常,繼續講課!
}
catch (MaoYanException e)//對拋出冒煙異常進行接收
{
System.out.println(e);
test();
/*MaoYanException e=new MaoYanException();*/
//throw e;//將解決不了的問題繼續拋出。
/*考慮到實際開發中是不應該拋出調用者無法解決的異常,此時應對異常進行轉換*/
throw new NoPlanException("課時進度無法繼續!");//拋出與教學任務有關的異常
}
}
public void test()//老師處理異常的方法
{
System.out.println("做練習!");
}
}
class ExceptionDemo2
{
public static void main(String[] args)
{
Teacher t=new Teacher("老畢");
try//公司對老師拋出的教務計劃異常的環繞處理
{
t.prelect();
}
catch (NoPlanException e)//異常接收
{
System.out.println(e);
System.out.println("換個老師講課!");//異常處理方法
}
}
}
如有錯漏,誠懇求證!