您好,登錄后才能下訂單哦!
好程序員Java教程分享Java系列之異常定義
異常:就是程序在運行的過程中遇到的種種不正常的情況。
特點:如果一個程序在運行中遇到了一個未經處理的異常,則這個異常會終止程序的運行。
? 但是如果程序出現的異常被處理了,此時程序不會被終止。所以我們需要知道怎么去處理異常。
其實在Java中,異常也是一個類。
類的體系:
- Throwable: 是所有的異常的根類
- Error: 發生在編譯器級別的,我們程序無法處理的錯誤。
- Exception: 我們可以去處理的異常。
- RuntimeException:
異常的分類:可以分成兩種異常:
- 運行時異常(Runtime Exception)
- 發生在程序運行的過程中的異常。
- 如果不處理這種異常,程序可以正常編譯,但是當執行到異常產生的時候,會終止程序的運行。
- 例如:NullPointerException、IndexOutOfBoundsException、ArithmeticException...
- 非運行時異常(Non-Runtime Exception)
- 發生在程序編譯的過程中的異常。(編譯時異常)
- 如果不處理這種異常,程序將無法進行編譯。
- 例如:ParseException...
需要使用語法:try-catch-finally
語法:
try {
? // 這里寫可能會產生異常的代碼。
? // 注意:
? // 一旦這里面的代碼產生了異常,從異常產生開始往后所有try中的代碼都不再執行,直接執行指定的catch
}
catch(需要捕獲的異常類型 標識符) {
? // 捕獲異常,如果try中產生的異常類型和我們要捕獲的異常類型匹配,此時會執行這個代碼段中的內容
? // 如果執行到這里了,相當于這個異常被捕獲、處理了,這個異常將不再終止程序的運行。
}
finally {
? // 這里的代碼始終會執行。
? // 無論try中的代碼有沒有異常產生,這里的代碼都會執行。
? // 在這里我們一般情況下是做一些資源釋放的工作。
}
備注:
以上,是完整的try-catch-finally語句。但是實際在用的時候,try后面可以只有catch, 也可只有finally,但是不能什么都沒有。
- 一般情況下,catch我們是不會省略不寫的。
- 如果try中的代碼可能產生的異常不止一種
- 如果需要對產生的不同異常進行不同的處理,可以使用多個catch語句
- 多個catch語句的先后順序
- 如果多個catch中的異常,沒有繼承關系,則先后順序沒有影響
- 如果多個catch中的異常,有繼承關系,則子類異常在前,父類異常在后
- 如果需要對某些異常做同樣的處理,可以在同一個catch中,用 | 拼接所有要處理的異常。
- 這些用|拼接起來的異常之間,不能有繼承關系
- 如果需要對所有的異常做同樣的處理,可以在一個catch中捕獲一個父類異常。
public static int show(int a, int b) { int c = 0; try { c = a / b; // 能走到這里,說明上面的除沒有異常。 return c; } catch (ArithmeticException e) { System.out.println("出現了一個算術異常"); return c; } finally { // 在return之前,執行finally中的代碼段 System.out.println("finally中的代碼執行了"); c = -10; } }
以上代碼段,在try和catch中都有return語句。
finally中的代碼始終會執行,但是針對這種情況,他的執行時機:
先執行return語句,此時,將需要返回的值緩存起來。然后再去執行finally語句中的代碼,執行結束后,返回剛才緩存的那個值。
常用在某一個方法中,表示拋出一個異常對象。等在調用這個方法的時候去處理這個異常。
一個異常對象被實例化完成后,不具備任何意義。只有被throw關鍵字拋出了,才具備異常的功能。
- 常用在方法的聲明部分,用來描述這個方法可能會拋出什么異常,給調用這個方法的部分看的。
- 如果在方法中使用throw拋出了一個Runtime Exception:
- throws可以寫,也可以不寫
- 備注:一般情況下,我們還是會按照實際情況進行描述的。
- 如果在方法中使用throw拋出了一個Non-Runtime Exception:
- 此時throws必須寫
- 可以在方法中不去處理異常,將異常處理提到調用這個方法的時候。
注意:在方法重寫中
- 如果重寫的方法拋出的是一個Non-Runtime Exception
- 子類方法拋出的異常需要父類方法拋出異常的子類型,或者等同于父類方法拋出的異常類型
- 不能讓子類重寫的方法拋出異常的類型高于父類方法拋出的異常類型
系統給我們提供了很多的異常類,但是這些異常類并不能夠滿足我們所有的需求。這種情況下,我們就需要去自定義異常。繼承自異常類,寫一個子類即可。
自定義RuntimeException
繼承自RuntimeException類,寫一個子類。這個子類異常就是一個運行時異常。
class NumberOfLegException extends RuntimeException { /** * 通過一個異常描述信息來實例化一個異常對象 * @param message */ public NumberOfLegException(String message) { // 怎么樣去設置這個異常信息? super(message); } }
自定義Non-Runtime Exception
繼承自Exception類,寫一個子類。這個子類異常就是一個非運行時異常。
class NumberOfLegException extends Exception { /** * 通過一個異常描述信息來實例化一個異常對象 * @param message */ public NumberOfLegException(String message) { // 怎么樣去設置這個異常信息? super(message); } }
在自定義異常類的時候,類名最好使用Exception作為結尾
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。