1. 程式人生 > >第3篇 Java異常

第3篇 Java異常

異 常:★★★★

異常:就是不正常。程式在執行時出現的不正常情況。其實就是程式中出現的問題。這個問題按照面向物件思想進行描述,並封裝成了物件。因為問題的產生有產生的原因、有問題的名稱、有問題的描述等多個屬性資訊存在。當出現多屬性資訊最方便的方式就是將這些資訊進行封裝。異常就是java按照面向物件的思想將問題進行物件封裝。這樣就方便於操作問題以及處理問題。

 

出現的問題有很多種,比如角標越界,空指標等都是。就對這些問題進行分類。而且這些問題都有共性內容比如:每一個問題都有名稱,同時還有問題描述的資訊,問題出現的位置,所以可以不斷的向上抽取。形成了異常體系

 

--------java.lang.Throwable

Throwable:可丟擲的。

|--Error:錯誤,一般情況下,不編寫針對性的程式碼進行處理,通常是jvm發生的,需要對程式進行修正。

|--Exception:異常,可以有針對性的處理方式

 

無論是錯誤還是異常,它們都有具體的子類體現每一個問題,它們的子類都有一個共性,就是都以父類名才作為子類的字尾名

 

這個體系中的所有類和物件都具備一個獨有的特點;就是可拋性

可拋性的體現:就是這個體系中的類和物件都可以被throws和throw兩個關鍵字所操作。

------------------------------------------------------

class  ExceptionDemo{

public static void main(String[] args) {

// byte[] buf = new byte[1024*1024*700];//java.lang.OutOfMemoryError記憶體溢位錯誤

}

}

------------------------------------------------------

在開發時,如果定義功能時,發現該功能會出現一些問題,應該將問題在定義功能時標示出來,這樣呼叫者就可以在使用這個功能的時候,預先給出處理方式。

 

如何標示呢?通過throws關鍵字完成,格式:throws 異常類名,異常類名...

這樣標示後,呼叫者,在使用該功能時,就必須要處理,否則編譯失敗。

 

處理方式有兩種:1、捕捉;2、丟擲。

對於捕捉:java有針對性的語句塊進行處理。

try {

需要被檢測的程式碼;

}

catch(異常類 變數名){

異常處理程式碼;

}

fianlly{

一定會執行的程式碼;

}

--------------------------------------------------------

catch (Exception e) { //e用於接收try檢測到的異常物件。

System.out.println("message:"+e.getMessage());//獲取的是異常的資訊。

System.out.println("toString:"+e.toString());//獲取的是異常的名字+異常的資訊。

e.printStackTrace();//列印異常在堆疊中資訊;異常名稱+異常資訊+異常的位置。

}

---------------------------------------------------------

異常處理原則:功能丟擲幾個異常,功能呼叫如果進行try處理,需要與之對應的catch處理程式碼塊,這樣的處理有針對性,拋幾個就處理幾個。

 

特殊情況:try對應多個catch時,如果有父類的catch語句塊,一定要放在下面。

 

throw 和throws關鍵字的區別:

throw用於丟擲異常物件,後面跟的是異常物件;throw用在函式內。

throws用於丟擲異常類,後面跟的異常類名,可以跟多個,用逗號隔開。throws用在函式上。

 

通常情況:函式內容如果有throw,丟擲異常物件,並沒有進行處理,那麼函式上一定要宣告,否則編譯失敗。但是也有特殊情況。

 

異常分兩種:

1:編譯時被檢查的異常,只要是Exception及其子類都是編譯時被檢測的異常。

2:執行時異常,其中Exception有一個特殊的子類RuntimeException,以及RuntimeException的子類是執行異常,也就說這個異常是編譯時不被檢查的異常。

 

編譯時被檢查的異常和執行時異常的區別:

編譯被檢查的異常在函式內被丟擲,函式必須要宣告,否編譯失敗。

宣告的原因:是需要呼叫者對該異常進行處理。

執行時異常如果在函式內被丟擲,在函式上不需要宣告。

不宣告的原因:不需要呼叫者處理,執行時異常發生,已經無法再讓程式繼續執行,所以,不讓呼叫處理的,直接讓程式停止,由呼叫者對程式碼進行修正。

 

定義異常處理時,什麼時候定義try,什麼時候定義throws呢?

功能內部如果出現異常,如果內部可以處理,就用try;

如果功能內部處理不了,就必須宣告出來,讓呼叫者處理。

 

自定義異常:當開發時,專案中出現了java中沒有定義過的問題時,這時就需要我們按照java異常建立思想,將專案的中的特有問題也進行物件的封裝。這個異常,稱為自定義異常。

 

對於除法運算,0作為除數是不可以的。java中對這種問題用ArithmeticException類進行描述。對於這個功能,在我們專案中,除數除了不可以為0外,還不可以為負數。可是負數的部分java並沒有針對描述。所以我們就需要自定義這個異常。

 

自定義異常的步驟:

1:定義一個子類繼承Exception或RuntimeException,讓該類具備可拋性。

2:通過throw 或者throws進行操作。

 

異常的轉換思想:當出現的異常是呼叫者處理不了的,就需要將此異常轉換為一個呼叫者可以處理的異常丟擲。

 

try  catch  finally的幾種結合方式:

1,

try

catch

finally

 

這種情況,如果出現異常,並不處理,但是資源一定關閉,所以try  finally集合只為關閉資源

記住:finally很有用,主要使用者關閉資源。無論是否發生異常,資源都必須進行關閉。

System.exit(0); //退出jvm,只有這種情況finally不執行。

 

當異常出現後,在子父類進行覆蓋時,有了一些新的特點:

1:當子類覆蓋父類的方法時,如果父類的方法丟擲了異常,那麼子類的方法要麼不丟擲異常要麼丟擲父類異常或者該異常的子類,不能丟擲其他異常。

2:如果父類丟擲了多個異常,那麼子類在覆蓋時只能丟擲父類的異常的子集。

 

注意:

如果父類或者介面中的方法沒有丟擲過異常,那麼子類是不可以丟擲異常的,如果子類的覆蓋的方法中出現了異常,只能try不能throws。

如果這個異常子類無法處理,已經影響了子類方法的具體運算,這時可以在子類方法中,通過throw丟擲RuntimeException異常或者其子類,這樣,子類的方法上是不需要throws宣告的。

 

常見異常:

1、腳標越界異常(IndexOutOfBoundsException)包括陣列、字串;

空指標異常(NullPointerException)

2、型別轉換異常:ClassCastException

3、沒有這個元素異常:NullPointerException

4、不支援操作異常;

異常要儘量避免,如果避免不了,需要預先給出處理方式。比如家庭備藥,比如滅火器。

-----------------------------------------------------------------------------------------------

包:定義包用package關鍵字。

1:對類檔案進行分類管理。

2:給類檔案提供多層名稱空間。

 

如果生成的包不在當前目錄下,需要最好執行classpath,將包所在父目錄定義到classpath變數中即可。

一般在定義包名時,因為包的出現是為了區分重名的類。所以包名要儘量唯一。怎麼保證唯一性呢?可以使用url域名來進行包名稱的定義。

package pack;//定義了一個包,名稱為pack。 注意:包名的寫法規範:所有字母都小寫。

//package cn.itcast.pack.demo;

 

類的全名稱是 包名.類名

    編譯命令:javac –d 位置(.當前路徑) java原始檔 (就可以自動生成包)

 

包是一種封裝形式,用於封裝類,想要被包以外的程式訪問,該類必須public;

類中的成員,如果被包以外訪問,也必須public;

 

包與包之間訪問可以使用的許可權有兩種:

1:public

2:protected:只能是不同包中的子類可以使用的許可權。

 

總結java中的四種許可權:

    範圍       public protected default private

同一個類中       ok ok ok ok

同一包中  ok ok ok

子類  ok  

不同包中         ok

-----------------------------------------------------------------------------------------------

Import - 匯入:類名稱變長,寫起來很麻煩。為了簡化,使用了一個關鍵字:import,可以使用這個關鍵字匯入指定包中的類。記住:實際開發時,到的哪個類就匯入哪個類,不建議使用*.

import packa.*;//這個僅僅是匯入了packa當前目錄下的所有的類。不包含子包。

import packa.abc.*;//匯入了packa包中的子包abc下的當前的所有類。

 

如果匯入的兩個包中存在著相同名稱的類。這時如果用到該類,必須在程式碼中指定包名。

 

常見的軟體包:

java.lang : language java的核心包,Object System  String Throwable jdk1.2版本後,該包中的類自動被匯入。

java.awt : 定義的都是用於java圖形介面開發的物件。

javax.swing: 提供所有的windows桌面應用程式包括的控制元件,比如:Frame , Dialog, Table, List 等等,就是java的圖形介面庫。

java.net : 用於java網路程式設計方面的物件都在該包中。

java.io : input  output 用於操作裝置上資料的物件都在該包中。比如:讀取硬碟資料,往硬碟寫入資料。

java.util : java的工具包,時間物件,集合框架。

java.applet: application+let 客戶端java小程式。server+let  -->  servlet 服務端java小程式。

 

jar :java的壓縮包,主要用於儲存類檔案,或者配置檔案等。

命令格式:jar –cf 包名.jar 包目錄

   解壓縮:jar –xvf 包名.jar

 將jar包目錄列表重定向到一個檔案中:jar –tf 包名.jar >c:\1.txt