Java的異常處理
1. Java 中異常分為哪些種類
按照異常需要處理的時機分為編譯時異常(CheckedException)和運行時異常(RuntimeException)。只有java語言提供了Checked異常, Java 認為Checked異常都是可以被處理的異常,所以Java程序必須顯式處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時就會發生錯誤無法編譯。這體現了Java的設計哲學:沒有完善錯誤處理的代碼根本沒有機會被執行。對Checked異常處理方法有兩種:
1當前方法知道如何處理該異常,則用try…catch塊來處理該異常。
2當前方法不知道如何處理,則在定義該方法是聲明拋出該異常。
運行時異常只有當代碼在運行時才發行的異常,編譯時不需要try catch。Runtime如除數是0和數組下標越界等,其產生頻繁,處理麻煩,若顯示申明或者捕獲將會對程序的可讀性和運行效率影響很大。所以由系統自動檢測并將它們交給缺省的異常處理程序。當然如果你有處理要求也可以顯示捕獲它們。
2.調用下面的方法,得到的返回值是什么?
public int getNum() { try { int a = 1/0; return 1; } catch (Exception e) { return 2: } finally{ return 3; }
1
2
3
4
5
6
7
8
9
代碼在走到第3行的時候遇到了一個MathException
,這時第四行的代碼就不會執行了,代碼直接跳轉到catch語句中,走到第6行的時候,異常機制有這么一個原則如果在catch中遇到了return或者異常等能使該函數終止的話那么有finally 就必須先執行完finally代碼塊里面的代碼然后再返回值。因此代碼又跳到第8行,可惜第8行是一個return語句,那么這個時候方法就結束了,因此第6行的返回結果就無法被真正返回。如果finally僅僅是處理了一個釋放資源的操作,那么該道題最終返回的結果就是2。因此上面返回值是3。
3.error和exception的區別?
Error類和Exception類的父類都是Throwable類,他們的區別如下。
Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。對于這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。
Exception類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該盡可能處理異常,使程序恢復運行,而不應該隨意終止異常。
Exception類又分為運行時異常( Runtime Exception) 和受檢查的異常(Checked Exception
),運行時異常;ArithmaticException, llegalArgumentException,編譯能通過,但是一運行就終止了
,程序不會處理運行時異常,出現這類異常,程序會終止。而受檢查的異常,要么用try…catch
捕獲,要么用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。
4.Java異常處理機制
Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,
Throwable下面又派生了兩個子類: Error 和Exception,
Error 表示應用程序本身無法克服和恢復的一種嚴重問題。
Exception表示程序還能夠克服和恢復的問題,其中又分為系統異常和普通異常,系統異常是軟件本身缺陷所導致的問題,也就是軟件開發人員考慮不周所導致的問題,軟件使用者無法克服和恢復這種問題,但在這種問題下還可以讓 軟件系統繼續運行或者讓軟件死掉,例如,
數組腳本越界(ArrayIndexOutOfBoundsException) ,
空指針異常(NullPointerException),
類轉換異常(ClassCastException) ;
普通異常是運行環境的變化或異常所導致的問題,
是用戶能夠克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常后,程序不應該死掉。
java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try…catch處理或用throws聲明繼續拋給上層調用方法處理,所以普通異常也稱為checked異常,而系統異常可以處理也可以不處理,所以,編譯器不強制用try.catch處理或用throws聲明,所以系統異常也稱為unchecked異常。
5.下面列舉幾個常見的RuntimeException
(1) java.lang.NullPointerException 空指針異常;出現原因:調用了未經初始化的對象或者是不存在的對象。
(2) java.lang.ClassNotFoundException 指定的類找不到;出現原因:類的名稱和路徑加載錯誤;通常都是程序
試圖通過字符串來加載某個類時可能弓|發異常。
(3) java.lang.NumberFormatException 字符串轉換為數字異常;出現原因:字符型數據中包含非數字型字符。
(4) java.lang.IndexOutOfBoundsException 數組角標越界異常,常見于操作數組對象時發生。
(5) java.lang.IIlegalArgumentException 方法傳遞參數錯誤。
(6) java.lang.ClassCastException 數據類型轉換異常。
(7)java.lang.NoClassDefFoundException 未找到類定義錯誤。
(8) sQLException SQL異常,常見于操作數據庫時的SQL語句錯誤。
(9) java.lang.InstantiationException 實例化異常。
(10) java.lang.NoSuchMethodException 方法不存在異常。
6. throw 和throws的區別
throw:
(1) throw語句用在方法體內表示拋出異常,由方法體內的語句處理。
(2) throw是具體向外拋出異常的動作,所以它拋出的是一個異常實例, 執行throw一定是拋出了某種異常。
throws:
(1) throws語句是用在方法聲明后面,表示如果拋出異常,由該方法的調用者來進行異常的處理。
(2) throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
(3) throws 表示出現異常的一種可能性,并不一定會發生這種異常。
7. final、 finally、 finalize 的區別?
(1) final: 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。
(2) finally: 異常處理語句結構的一部分,表示總是執行。
(3) finalize: Object 類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆蓋此方法,提供垃圾收集時的其他資源回收,例如關閉文件等。該訪法更像是一個對象生命周期的臨終方法, 當該方法被系統調用則代表該對象即將“死亡”,但是需要注意的是,我們主動行為上去調用該方法并不會導致該對象“死亡”,這是一個被動的方法(其實就是回調方法),不需要我們調用。
Java 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。