黑馬程序員_【總結】_ 異常知識梳理_(end)

異常知識梳理


---------- android培訓 java培訓、期待與您交流! ---------- 

---------------------------------------------------------------------------------------------------------------------------------------------
1、throws 聲明異常------throw  捕獲異常
2、聲明異常時,建議聲明更爲具體的異常,這樣處理可以更具體
3、在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
4、自定義異常:  必須是自定義類繼承Exception
繼承Exception原因:
1、異常體系有一個特點,因爲異常類和異常對象都需要被拋出,
他們都具備可拋性,這個可拋性是Throwable這個體系中獨有特點
2、只有這個體系中的類和對象纔可以被throws 和throw 操作。
5、Exception 中有一個特殊的子類異常RuntimeException 運行時異常
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過
如果在函數上聲明該異常,調用者可以不用進行處理,編譯一樣通過
6、自定義的異常時:如果該異常的發生,無法在繼承進行運算
就讓自定義類異常繼承RuntimeException
7、異常,分兩種
1、編譯時,被檢測出的異常   (方法後需要拋出異常。)
2、編譯時,不被檢測出的異常(運行時的異常就是RuntimeException異常)
-----------------------------------------------------------
【1】
1
Throwable
Error  嚴重性問題
Exception非嚴重性,針對性進行處理。
都是以父類名作爲後綴。
問題也是現實生活中的一個具體事物,也可以通過Java的類的形式進行描述
並封裝成對象,其實就是Java對不正常情況進行描述後的對象體現。
2、異常的處理
Java提供了特有的語句進行處理
try{
需要被檢測的代碼
}
catch(異常類 變量){
處理異常的代碼(也就是處理方式)
}
finally{
一定會執行的語句。
}
3、對捕獲到的異常對象進行常見的操作
String getMessage(): 獲取異常信息
4、聲明異常\ 捕獲異常
throws 聲明異常
throw  捕獲異常
5、對多異常的處理
1、聲明異常時,建議聲明更爲具體的異常,這樣處理可以更具體
2、對聲明幾個異常,對應幾個 catch 塊,
如果多個catch塊中的異常出現了繼承關係,父類異常catch塊放在最下面。
建立在進行catch處理時,catch 塊中一定要具體的處理方法。
而不是 e.printStackTrace() 或 簡單的輸出語句
【2】
        【自定義異常】
因爲 在項目中會出現特有的問題
而這些問題並未被java所描述並封裝
所以對這些特有的問題可以按照java的對問題封裝的思想
將特有的問題,進行自定義的一場封裝


自定義異常
需求:
在本程序中對於除數是負數-1,也是視爲是錯誤的,是無法進行運算的
那麼就需要對這個問題進行自定義的描述。


當在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
要麼在內部try catch 處理
要麼在函數上聲明讓調用這處理


一般情況在 函數內出現異常,函數上需要聲明.


發現打印的結果中只有異常名稱,卻沒有異常的信息
因爲自定義的異常並未定義信息


如何定義異常信息呢。
因爲父類中已經把異常信息操作都完成了,
所以子類只要在構造時,將一類信息傳遞給父類通過super語句
那麼就可以直接功過getMessage方法獲取自定義的異常。


自定義異常:  必須是自定義類繼承Exception
繼承Exception原因:
異常體系有一個特點,因爲異常類和異常對象都需要被拋出,
他們都具備可拋性,這個可拋性是Throwable這個體系中獨有特點

只有這個體系中的類和對象纔可以被throws 和throw 操作。
【3】
throws和throw區別
throws使用在函數上
throw 使用在函數內


throws 後面跟的是異常類,可以跟多個,用逗號隔開      就是:()這個位置{}
throw  後面跟的是異常對象。
【4】
【【異常中的特殊子類異常】】
Exception 中有一個特殊的子類異常RuntimeException 運行時異常
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過
如果在函數上聲明該異常,調用者可以不用進行處理,編譯一樣通過


之所以在函數上聲明,是因爲不需要調用者處理
當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,
希望停止程序後,由程序員對代碼進行修正。
【m】
自定義的異常時:如果該異常的發生,無法在繼承進行運算
就讓自定義類異常繼承RuntimeException


對於異常,分兩種
1、編譯時,被檢測出的異常   (方法後需要拋出異常。)
2、編譯時,不被檢測出的異常(運行時的異常就是RuntimeException異常)
(方法中拋出了非Run異常或其子類,上面沒有標識,就視爲有安全隱患的。)
【【【【結論:如果自定義異常,要麼繼承Exception要麼繼承RuntimeException】】】】
class FuException extends Exception{
		private int value;
		//這個也可以,裏面有默認的。
		FuException(){
			super();
		}
		FuException(String msg,int value){
			super(msg);
			this.value=value;
		}
		public int getValue(){
			return value;
		}
	/*	
	}【m】
	class FuException extends RuntimeException{
		private int value;
		//這個也可以,裏面有默認的。
		FuException(){
			super();
		}
		FuException(String msg,int value){
			super(msg);
			this.value=value;
		}
		public int getValue(){
			return value;
		}
	class Demo_3{
		int div(int a,int b) //這裏不在需要聲明
		{
			if(b <0){
				throw new FuException("出現負數",b);//手動通過throw 關鍵字拋出一個自定義的異常
			}
			if(b =0){
				throw new FuException("出現0",b);//手動通過throw 關鍵字拋出一個自定義的異常
			}
			return a/b;
		}
	}
	*/		
	}
	class Demo_3{
		int div(int a,int b) throws FuException{
			if(b <0){
				//System.out.println("出現異常:");
				throw new FuException("出現負數",b);//手動通過throw 關鍵字拋出一個自定義的異常
			}
			return a/b;
		}
	}
	public class D_Exception {
		public static void main(String[] args){
			Demo_3 d=new Demo_3();
			try{
				int x=d.div(4,2);
				System.out.println("x="+x);
			}
			catch(FuException e){
				//System.out.println(e.toString());
				//System.out.println("出現負數");
				System.out.println("負數:"+e.getValue());
			}
			//catch(Exception e){	
			//}
			System.out.println("over");
		}
	}
	/*
	class Person_1{
		 public void checkName(String name){
			 //if(name.equals("lisi")){//一旦[a]處傳入NULL,那麼就回報NullPointerException異常
			 						   程序就停掉了。如何修正:
			 if("lisi".equalse(name)){//if(name!==null&&name.equals("lisi")){			 						   
				 System.out.println("YES");
			 }else {
				 System.out.println("NO");
			 }
		 }
	}
	main(){
		Person_1 p=new Person_1();
		p.checkName(null);//[a]
	}
	*/
【5】


 畢老師用電腦上課。
 老師、電腦、倆類,上課是行爲.
 
 上課中會出現各種問題,產生異常。 
 比如電腦、藍屏、冒煙兒    :接下來進行描述,封裝成對象            (自定義異常
 藍屏後只許重啓即可
 而  當冒煙發生後,會出現進度無法繼續。
  就出現了講師的問題,課時計劃無法完成。     (又多了個類
 
 【通過state來手動設置異常】


//藍屏異常
class LPException extends Exception{
//藍屏是可以處理的,大多時候重啓即可,那麼這裏就需要電腦的重啓功能了
	private Comeputer comp;
	LPException(String message){
		super(message);
	}
	public void goReset(){
		comp.reset();
	}
}
//冒煙異常
class MYException extends Exception{ //RuntimeException{//冒煙了無法處理了
	MYException(String message){
		super(message);
	}	
}
//人爲異常
class NoPlanException extends Exception{
	NoPlanException(String message){
		super(message);
	}
}
class Comeputer {
	private int state =3;//2表示藍屏 3冒煙
	public void run()throws LPException,MYException{//拋出可能有的異常
		if(state==2){
			throw new LPException("電腦藍屏了。");//拋出異常
		}
		if(state==3){
			throw new MYException("電腦冒煙兒了");//拋出異常
		}
		System.out.println("comepter run");
	}
	public void reset(){
		state=1;
		System.out.println("comepter  reset");
	}
}
class Teacher{
	private String name;
	private Comeputer cmpt;	
	Teacher(String name){//初始化老師名字、電腦
		this.name=name;
		cmpt=new Comeputer();
	}	
	public void prelect()throws NoPlanException{//MYException{//講課方法		
		try{
			cmpt.run();
		}
		catch(LPException e){
			cmpt.reset(); 
		}
		catch(MYException e){//接收到冒煙異常然後拋出冒煙後無法繼續講課的問題,這個問題就好處理			
			test(); 
			throw new NoPlanException("課時無法繼續"+e.getMessage());
			//這裏的邏輯是,冒煙是不可處理異常,發生該異常後,處理就是換電腦,換老師等延續課時的方案。
			//test();  throw 後面是不能更語句的。他和return一樣是結束語句。
		}
		//System.out.println("開始講課");
	}
	public void test(){
		System.out.println("大家做練習吧");
	}
}
電腦冒煙兒了,就相當於 error , 屬於嚴重的問題,
而 出現了這種情況,卻是可以有其他方式處理的,
可以借用電腦,可以替換個老師,可以自習,可以放假。
【6】
【異常練習】
 有一個圓形和長方形
 都可以獲取面積,對於面積如果出現非法數值,視爲是貨獲取面積出現的問題
 
 問題通過異常來表示
 先有對這個程序進行基本設計
 
 正常代碼,和問題處理代碼分隔開。
 
 寫代碼的過程中,遇到問題,用代碼封裝起來,問題也是一個對象。
 */
//面積接口
interface Shape{
	double getArea();
}
//負數或零異常
class FLException extends RuntimeException { //Exception{
	FLException(String msg){
		super(msg);
	}//
}
//長方形 
class Rec implements Shape{	
	private int len,wid;	
	Rec(int len,int wid) {//throws FLException //使用Runtaime異常這裏就不用在寫,main方法中也不用在寫。
		if(len<=0 ||wid<=0)
			throw new FLException("數值錯誤!");
		
		this.len=len;
		this.wid=wid;
	}
	public double getArea(){
		System.out.println("Area:"+len*wid);
		return len*wid;
	}
}
//圓形
class Yuan implements Shape{
	private double r;
	private static final double PI=2.14;  //設爲全局常量
	Yuan(double r){
		if(r<=0)
			throw new FLException("非法!");
		
		this.r=r;
	}
	public double getArea(){
		System.out.println("Area:"+r*r*PI);
		return r*r*PI;
	}
}
public class D_Exp_Test1 {
	public static void main(String[] args) {
		Rec r=new Rec(23,4);
		r.getArea();	
		Yuan yu=new Yuan(-3);
		yu.getArea();
	}
}






---------------------------------------------------------------------------------------------------------------------------------------------
---------- android培訓、 java培訓、期待與您交流!----------


----------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章