萬物鼻祖Object和Java異常


                                   

一:萬物鼻祖Object

1.概述:

         類 Object是類層次結構的根類。每個類都使用Object 作爲超類。所有對象(包括數組)都實現這個類的方法。

          Object是不斷抽取出來的,具備着所有對象都具備的共性內容

2.方法介紹:

          (1) Object.equals()方法比較的是保存在內存中的地址,新定義的類可以重寫equals方法,兩個不同的類型
                 之間比較會拋出 ClassCastException 類型轉換異常
                  instanceof關鍵字:比較是否是同類型
                 在創建類時都會默認繼承Object類,並且一般會重寫equals方法,equals方法重寫時通常要重寫hashCode方法,
                 以便於hashCode協定中聲明相等對象必須具有相等的哈希碼

          (2) Object.hashCode()方法返回一個對象在內存中的哈希值(10進製表示),Integer.toHexString()可將該值轉換爲               16進制,此方法爲本地方法,有本地操作系統去實現

          (3) Object.getClass()返回Class對象,該類是運行時類,在內存中只會有一份,在Java中所有的類在內存中都有
              一個字節碼文件.class,而所有的字節碼文件也是對象,這些對象所屬類型爲Class類,如下圖所示

          (4) Object.toString()方法返回 類名和哈希碼 如同:
              Object.getClass().getName+object.hashCode();一般所有的子類都會重寫該方法

          




二.異常

1.概述:

         所謂異常就是在運行時期發生的不正常情況,在Java中用類的形式對不正常情況進行了描述和封裝,描述不正常的情況
    的類,就稱爲異常類,以前正常流程代碼和問題處理代碼相結合,而現在將正常流程代碼和問題處理代碼分離,提高閱讀性。

         其實異常類就是Java通過面向對象的思想將問題封裝成了對象,用異常類對其進行描述。
    不同的問題用不同的異常類進行具體的描述。比如角標越界,空指針。。。問題很多意味着描述的類也很多,
    因此將其共性向上抽取,形成了異常體系。


2.最終異常問題分成了兩大類:

  基類:Throwable   子類:Error和Exception,如圖1

        無論是error還是異常都是問題,問題發生就應該可以拋出,讓調用者知道處理
        該體系的特點就在於Throwable及其所有的子類都具有可拋性


  可拋性到底怎麼指的是什麼呢?怎麼體現可拋性呢?
      其實就是通過兩個關鍵字來體現。
      throws 和 throw ,凡是可以被這兩個關鍵字所操作的類和對象都具有可拋性


      (1)一般不可處理的:Error
                       特點:是由jvm拋出的嚴重性問題(即jvm也不能處理的問題,這時jvm已經不能正常運行)。
                             這種問題發生一般不針對性處理,直接修改程序


      (2)可處理的:Exception(jvm還能處理的問題,這時jvm還能正常運行)


3.該體系的特點:子類的後綴名都是父類名作爲後綴,閱讀性很好。

4.自定義異常類:用於解決Java中異常體系裏沒有的異常類

     (1)如果要讓一個類成爲異常類必須要繼承異常體系,因爲只有成爲異常體系的子類纔有資格具備可拋性,纔可以讓
        throw和throws關鍵字所操作
     (2)要讓jvm拋出還得聲明或捕獲異常(throws ...)或(try catch)

5.異常分類:

  (1)編譯時被檢測異常:只要是Exception和其子類都是,除了特殊子類RuntimeException體系
     這種問題一旦出現希望在編譯時就進行檢測,讓這種問題有對應的處理方式(聲明或者捕獲)
     這樣的問題都可以針對性的處理
  (2)編譯時不被檢測異常(運行時異常):就是Exception中的RuntimeException體系
     這種問題的方式無法讓功能繼續,運算無法進行,更多是調用者的原因造成的或者引發了內部狀態的改變導致的。
     這種問題一般不處理,直接變異通過,在運行是直接讓調用者調用時的程序直接停止,讓調用者對代碼進行修改。       
       

6.throws和throw的區別

  (1)throws使用在函數上;throw使用在函數內
  (2)throws拋出的是異常類,可以拋出多個,用逗號隔開;throw拋出的是異常對象
  (3)throws是在聲明時使用,throw是在捕獲是使用

7.異常處理的捕捉形式:這是可以對異常進行針對性處理的方式

  (1)具體格式是:
    try{
       需要被檢測的代碼
    }catch(異常類 變量){ 該變量用於接受用於發生的異常對象
       處理異常的代碼,異常對象的printStackTrace()方法就是默認的異常處理機制調用異常對象的這個方法,打印信息 
       和運行時異常類似(代碼出現的異常位置)
    }finally{ 通常用於關閉(釋放)數據庫之類的資源
     一定會執行的代碼
    }
  (2)組合特點:
  (1)try catch finally(同時用,一旦try發現異常,則異常後面的代碼就不執行啦,若有像數據庫連接資源之類的
                       這時finally就起作用啦,這時可以再finally中關閉資源)
  (2)try catch catch catch ....(一個或多個catch,try發現異常時根據catch代碼順序捕獲)
  (3)try finally(特殊情況:沒有捕獲異常,因此必須用throws聲明異常)

8.異常處理原則:

  (1)函數內部如果拋出需要檢測的異常,那麼函數上必須要聲明,否則必須在函數內用try catch捕捉,否則編譯失敗。
  (2)如果調用了聲明異常的函數,要麼trycatch要麼throws,否則編譯失敗。
  (3)什麼時候try?什麼時候throws?
     功能內容可以解決,用catch,解決不了有throws告訴調用者解決
  (4)一個功能如果拋出了多個異常,那麼調用時必須有多個catch進行針對性的處理
     內容有幾個需要檢測的異常就拋出幾個異常,拋出幾個就catch幾個。

9.異常注意事項:

 (1)子類在覆蓋父類方法時,父類的方法如果拋出了異常,那麼子類只能拋出父類的異常或者該異常的子類
 (2)如果父類拋出多個異常,那麼子類只能拋出父類異常的子類
    簡單說:子類覆蓋父類只能拋出父類的異常或者該異常的子類
    注意:如果父類的方法沒有拋出異常,那麼子類覆蓋時絕對不能拋,就只能try

10.附上一個異常代碼的程序

/*
 * 異常類LanPingException 繼承 Exception 是一個編譯時異常類
 */
public class LanPingException extends Exception{
    LanPingException(){		
	}
	LanPingException(String msg){
		super(msg);
	}
}

/*
 * 異常類MaoYanException 繼承 Exception 是一個編譯時異常類
 */
public class MaoYanException extends Exception{
    MaoYanException(){
		
	}
	MaoYanException(String msg){
		super(msg);
	}
}

/*
 * 異常類NoPlanException 繼承 Exception 是一個編譯時異常類
 */
public class NoPlanException extends Exception {
	NoPlanException(){
		
	}
	NoPlanException(String msg){
		super(msg);
	}
}
public class Person{
		private Computer com;
		public Person(){
			this.com = new Computer();
		}
		public void startWork()throws NoPlanException{
			try{
				com.start();
			}catch(LanPingException e){
				com.reset();
				System.out.println(e.getMessage());
				System.out.println("重啓成功");
				startWork();
			}catch(MaoYanException e){
				throw new NoPlanException("課時進度無法完成,原因:"+e.getMessage());
			}

		}
	}
public class Computer{
	private int state = 2;
	public Computer() {}
	public Computer(int state){
		this.state = state;
	}
	public void reset(){
		this.state = 0;
	}
	public void start() throws LanPingException, MaoYanException {
		if(this.state == 0){
			System.out.println("電腦啓動");
			System.out.println("開始上課");
		}
		if(this.state == 1){
			throw new LanPingException("電腦藍屏,等待重啓");
		}
		if(this.state == 2){
			throw new MaoYanException("電腦冒煙");
		}						
	}		
}

/*
 * 主類
 */
public class ExceptionTest {	
	public static void main(String[] args) { 
		Person person = new Person();
		try{
			person.startWork();
		}catch(NoPlanException e){
			System.out.println(e.getMessage());
			System.out.println("換人");
		}
	}		
}





發佈了46 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章