Java筆記系列(基於馬士兵的課堂)(2)-異常

Java的異常

最主要是java運行期的錯誤。程序時調出來的。

數組:在內存空間中分配n個空間,裝有每個值。(int[] arr = (1,2,3)每個空間有他的編號<0格=1,1格=2,2格=3>;輸出arr[0]<結果輸出值爲1>)

Java和c,c++不同,java會檢查數組(下標)的越界,c和c++需要自己檢查(否則產生緩衝區漏洞)<exception:越界,邏輯錯誤>

設計良好的程序應該在異常發生時提供處理這些錯誤的方法(將java的報錯轉換成正常語言語言,以便可以有處理錯誤的方法,讓普通人能理解<說一些有好的東西>)。

Java程序運行過程中如果發生一些異常事件,java會自動生成一個異常類對象。異常類對象封裝了異常事件的信息,並將其提交給java運行時系統,這個過程叫做拋出(throw)異常(某一句拋出異常)。

Java運行時默認信息,是直接打印異常類對象的信息。

當java運行時系統接收到異常對象時,會尋能處理這一異常代碼的並把當前異常對象交給其處理,這一過程叫做捕獲(catch)異常。

Try catch關鍵字


Try{System.out.println(2/0);}<請嘗試執行>catch()<可能拋出什麼樣的異常>;{System.out.println(“系統正在維護中,請與管理員聯繫”);

ae.printStackTrace()<打印對戰信息【這個錯誤怎麼引起的,哪一行引起的給程序員一個調試的提示,往往把他打印出來】>}(當出現異常,異常封裝到裏面,相當於傳遞了一個對象給了catch這個方法<其實不是方法>)[當出現異常,對象自動被初始化](注意ae是自定義異常的對象,其初始化由系統完成<產生錯誤時完成>)

java運行時當出現錯誤時先開有沒有catch處理它,沒有就直接拋出打印他。

想用catch必須用try。

一個類定義一種方法時往往會註明其可能會拋出什麼樣的異常。可以指明其可能拋出什麼樣的異常,使用throw關鍵字。

Jdk中定義了許多異常類,對應了各種各樣的可能出現的異常事件,這些異常事件有個根類——Throwable類(不是一個類,也不是一個接口,也不是一個exception)其下兩個子類(error,exception 前者是系統出錯<處理不了>,後者是可以解決的,其中還有一類Runtime Exception旗下還有許多類,除了runtime其他類必須逮)。

Runtime Exception是經常出的錯誤,可以不逮它(直接略過,這樣運行效率更高)<只不過運行出錯>,若某個方法 throw了某個exception,必須逮它.

 


ArithmeticException有個構造方法(api文檔中),可以輸出輸入結果。

在定義方法時void
 m(int i)throws ArithmeticException{if (i==0)throw new ArithmeticException(“被除數爲0”)}

異常必須得逮的異常:FileInputStream Io包裏的一個類,用來讀文件


FileInputStream in=null;

Try{in =new FileInputStream(“mylife.txt”)

Int b;

B=in.read();

While (b!=1) {

System.out.println((char)b);}

Catch (FileInputStreamException a){

a.     printStackTrace()

}catch (IOException a){

System.out.println(a.getMessage ());

}finally {

Try {in.close();

}catch (IOException e){

E.printSTackTrace();

}

}

}

通過一個try去catch多個exception去完成不同的錯誤報告,方便程序員修復程序Exception。

Finally關鍵字<無論是否產生某種Exception>

Try裏有多個語句,若第一個語句出錯,第二個語句及接下來語句不再執行,但下一個try會繼續執行,跟在try後面的finally一定會被執行,無論如何都需要執行。(用來關上一定需要關閉的文件,否則出現異常無法關閉)即使沒有出現任何錯誤,catch語句全被略過,finally一樣會被執行<進行資源的清除工作>

Try{}catch(){}catch(){}catch(){}…finally{}-執行下面語句

異常的捕獲和處理

在catch中封裝了,異常事件發生的信息,在catch語句塊中可以用這個對象的一些方法來來獲取這些信息,例如getMessage()方法,用來得到有關異常事件的信息,printStackTrace方法,用來跟蹤異常事件發生執行時的堆,棧內容。

Finally,用來清除臨時文件,可以更好地運行接下來的語句,使系統維護的比較好。

見具體Exception2

如果java裏catch到exception但不能解決,向上拋出Exception即可,用到throws

當解決不了某種異常(catch住了以後解決不了,只要向上級拋出就行了)

將可能出異常的語句,封裝在某個方法中,並註明拋出(拋出的類型)

Void f()throws <拋出錯誤類型1>,<拋出錯誤類型2>…{語句}

此時用f2()再封裝f()方法,再次拋出或者用try catch對f()拋出的異常做出處理,當然也可以再次拋出 在main方法中也再次拋出寫throws Exception(就是這個語句)(交給運行時系統打印Exception)

若已給方法再main方法拋出,還是會執行try catch語句。

程序員處理時第一行往往是你或系統提供給運行出錯時顯示的信息,之後是某個方法出錯(也可以是main方法出錯,方法出錯後面緊跟的是出錯行號<把堆棧信息打印出來>,根據行號,可以改正這些Exception)

注意:如果在之前已經把所有的大的Exception捕捉,再去捕捉屬於這個Exception的小類,編譯時一定會出錯,應該先捕捉小的再捕捉大的。

自定義異常:只需要從某種Exception(也可以是Exception)中繼承(注意RuntimeException可以逮也可以不逮,所以從此繼承要注意),在方法適當的位置生成自定義異常實例,並用throw語句拋出,在方法的聲明部分用throws語句聲明該方法可能拋出的異常。

具體方法:定義一個異常,從某一個異常類(Exception or RunTimeException)繼承,重寫構造方法,寫相關方法(編號,拋出怎樣的話)

在運行類中定義一個方法可能拋出自定義類型異常,寫方法語句(若某一步發生異常,不會繼續這個方法,直接拋錯)

主方法中運行這個方法,在之前加上try,在之後加上catch 其中逮到的異常類型是自定義異常類型[當然也可以將try catch封裝在一個方法中,這個方法肯定不在主方法中,再在主方法中直接對某個對象調用這個方法,來防止對象聲明,屬性或運行出現異常]

異常與繼承之間的關係:繼承異常(或者繼承類),重寫某一個方法(這個方法拋出某一類異常),

其子類若想重寫某一個方法,他可以拋出相當於父類同樣的異常,或者不拋出任何異常(與父類異常必須完全相同,不可大 ,不可小。)

總結:一張圖和五個關鍵字:老祖宗throwable -error&Exception-RuntimeException&必須處理

五個關鍵字:Throw,catch,try, throws, finally

先逮小的再逮大的,異常和重寫之間的關係。

注意:finally方法在所有方法中都會比return語句先行執行,而且一旦拋出某個方法執行不了的異常後,return語句一定不會執行,但是finally方法仍會執行。

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