一:萬物鼻祖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("換人");
}
}
}