新手了解java 異常處理基礎(chǔ)知識(shí)
一、異常體系結(jié)構(gòu)
1.什么是異常
在java程序運(yùn)行過程中,發(fā)生了一些意料之外的情況就是異常。在java中異常一顆分為兩大類:
(錯(cuò)誤)Error 和 (異常)Exception。
- 對(duì)于(錯(cuò)誤)Error來(lái)說(shuō),我們無(wú)法通過程序去解決所有的錯(cuò)誤,僅僅可以去嘗試捕獲這些錯(cuò)誤,但是無(wú)法處理,往往錯(cuò)誤的發(fā)生對(duì)程序來(lái)說(shuō)是重大的致命性問題,需要通過較大的調(diào)整去修正它。
- 對(duì)于(異常)Exception來(lái)說(shuō),它是我們可以通過程序去處理的,我們可以對(duì)這些異常情況做出捕獲和處理。
2.異常的體系結(jié)構(gòu)
Throwable
Error Exception
RutimeException 編譯時(shí)異常
說(shuō)明: RutimeException和一些編譯時(shí)異常繼承了Exception ,Exception 和Error繼承了Throwable。
運(yùn)行時(shí)異常(RutimeException)在代碼中我們往往不需要去捕獲它,而是通過處理代碼的邏輯來(lái)規(guī)避運(yùn)行時(shí)異常。常見的5種運(yùn)行時(shí)異常:
ClassCastException(類轉(zhuǎn)換異常)ArrayIndexOutOfBoundsException(數(shù)組越界異常)NullPointerException(空指針)ArrayStoreException(數(shù)據(jù)存儲(chǔ)異常,操作數(shù)組時(shí)類型不一致)NumberFormatException數(shù)字格式化異常
public class Demo{
public void test(){
//此代碼聲明這里會(huì)拋出一個(gè)運(yùn)行時(shí)異常
throw new RutimeException();
}
}
public class DemoTest{
public static void main(String[] args){
Demo demo = new Demo()
demo.test();
}
}
從上述代碼種可以看出,運(yùn)行時(shí)異常產(chǎn)生時(shí),代碼可以正常的編譯與運(yùn)行,但是運(yùn)行結(jié)果會(huì)拋出一個(gè)運(yùn)行時(shí)異常。
說(shuō)明:運(yùn)行時(shí)異常會(huì)向上傳播。
二、異常處理
當(dāng)異常發(fā)生時(shí),我們需要對(duì)其進(jìn)行處理,處理異常有兩種方式:
一種使用try…catch…finally進(jìn)行捕獲;
另一種使用throws的方式進(jìn)行拋出;
try…catch…finally
語(yǔ)法
try {
// 可能發(fā)生異常的代碼塊
} catch (/* 需要捕獲的異常類 */) {
// 捕獲到異常后的處理代碼塊
} finally {
// 不管是否會(huì)發(fā)生異常,此代碼塊都會(huì)被執(zhí)行
}
示例:
public class Demo1{
public static void main(String[] args){
String[] strs = {"張三","李四","王五"};
try {
System.out.println("-------");
System.out.println(strs[3]); // 此處會(huì)發(fā)生異常,當(dāng)異常發(fā)生后,后面的代碼都不會(huì)被執(zhí)行到
for (String str : strs) {
System.out.println(str);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("++++++++++");
} catch (Exception e) {
System.out.println("++++++++++");
}finally{
System.out.println("--------------");
}
}
}
說(shuō)明:在try…catch…語(yǔ)句中,try語(yǔ)句中產(chǎn)生異常的代碼后面的代碼不會(huì)被執(zhí)行,產(chǎn)生異常后直接到了catch語(yǔ)句塊中。catch語(yǔ)句塊可以寫多個(gè),catch語(yǔ)句分支是從上到下依次找對(duì)應(yīng)類型的,但是注意catch捕獲的異常類型中父類型必須寫在子類型的后面。
finally語(yǔ)句塊是無(wú)論異常是否產(chǎn)生都會(huì)執(zhí)行的。常用與資源的釋放。
throw 與 throws
- throws是異常處理機(jī)制的一種,而throw不是;
- throws是聲明異常類;而throw是拋出異常對(duì)象;
- throws可以聲明多個(gè)異常類,而throw只能拋出一個(gè)異常對(duì)象;
- throws是聲明在方法上的,而throw是定義在方法內(nèi)的;
示例:
public class Demo{
public void test() throws Exception{
//此代碼聲明這里會(huì)拋出一個(gè)異常
throw new Exception();
}
}
public class DemoTest{
public static void main(String[] args){
Demo demo = new Demo()
try {
demo.test();
}catch (Exception e) {
System.out.println("++++++++++");
}finally{
System.out.println("--------------");
}
}
}
三、自定義異常
運(yùn)行時(shí)異常
繼承 RutimeException
示例:
public class MyRutimeException extends RutimeException {
public MyRutimeException(String message){
super(message);
}
}
編譯時(shí)異常
繼承Exception
示例:
public class MyException extends Exception {
public MyException(String message){
super(message);
}
}
總結(jié)
本篇文章就到這里了,希望對(duì)你有所幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java實(shí)現(xiàn)Android拼圖游戲設(shè)計(jì)過程解析
這篇文章主要介紹了Java實(shí)現(xiàn)Android拼圖游戲設(shè)計(jì)過程解析,下面文章要接受的這是一款基于 Java 開發(fā)的移動(dòng)端安卓小游戲,可以作為大家在學(xué)習(xí)期間的一個(gè)小練習(xí),接下來(lái)和小編一起進(jìn)入文章學(xué)習(xí)具體內(nèi)容吧2022-02-02
java 實(shí)現(xiàn)雙向鏈表實(shí)例詳解
這篇文章主要介紹了java 實(shí)現(xiàn)雙向鏈表實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼
本篇文章主要介紹了Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-02-02
Spring Boot打開URL出現(xiàn)signin問題的解決
這篇文章主要介紹了Spring Boot打開URL出現(xiàn)signin問題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java thread start()和run()方法簡(jiǎn)析
本文以java中thread的start()和run()的區(qū)別做詳細(xì)介紹, 需要了解跟多的朋友可以參考下2012-11-11
springboot如何通過@PropertySource加載自定義yml文件
這篇文章主要介紹了springboot如何通過@PropertySource加載自定義yml文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

