一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用

深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用

2020-09-09 13:26zju_jzb Java教程

 Java異常處理機(jī)制在日常開發(fā)中應(yīng)用頻繁,本篇文章主要在基礎(chǔ)的使用方法上,更進(jìn)一步的,如何更加合理的使用異常機(jī)制,希望可以對各位朋友能有所幫助。

  java異常處理機(jī)制其最主要的幾個關(guān)鍵字:try、catch、finally、throw、throws,以及各種各樣的exception。本篇文章主要在基礎(chǔ)的使用方法上,介紹了如何更加合理的使用異常機(jī)制。 

try-catch-finally

    try-catch-finally塊的用法比較簡單,使用頻次也最高。try塊中包含可能出現(xiàn)異常的語句(當(dāng)然這是人為決定的,try理論上可以包含任何代碼),catch塊負(fù)責(zé)捕獲可能出現(xiàn)的異常,finally負(fù)責(zé)執(zhí)行必須執(zhí)行的語句,這里的代碼不論是否發(fā)生了異常,都會被執(zhí)行。

    針對這部分,因為很基礎(chǔ),所以就提幾點(diǎn)比較關(guān)鍵的建議:

      1、當(dāng)你在寫try-catch語句的時候,腦子里是知道自己要去針對哪種異常進(jìn)行處理的,不要只是以防萬一,加了個catch(exception e),這是毫無意義的。并且,一個try塊中可能有多個異常,對于每一類異常,要分別寫一個catch進(jìn)行捕獲?!      ?/p>

      2、針對可能出現(xiàn)異常的語句進(jìn)行try-catch,大段代碼的try-catch會非常不利于維護(hù)代碼時定位異??赡馨l(fā)生的位置,對于肯定不會發(fā)生異常的穩(wěn)定的代碼,不需要放在try塊中。

      3、try-catch雖然在功能上,可以成為流程控制的工具,達(dá)到條件分支的效果。但相比于if-else語句,java的異常處理機(jī)制基于面向?qū)ο蟮乃枷?,使用過程中需要更多的時間與空間的開銷,所以不要用異常機(jī)制去做基本的條件判斷,只有在程序會因為異常而中斷時進(jìn)行捕獲和處理。

      4、finally塊中永遠(yuǎn)不要寫return語句,因為finally塊中總是最后執(zhí)行,他會改變預(yù)期在trycatch塊中的返回值(舉個例子,你在catch中捕獲了一個異常并拋出e,又在finally語句中return true,這樣你拋出的異常就"消失"了,因為當(dāng)前函數(shù)的執(zhí)行結(jié)果已經(jīng)從拋出異常 轉(zhuǎn)變成 return true)。另外,在使用資源對象與流對象時,finally塊必須對資源對象、流對象進(jìn)行關(guān)閉。

java異常體系結(jié)構(gòu)

    java異常體系的基類是throwable,它主要有兩個子類:error exception。其結(jié)構(gòu)如下圖:

深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用      

    上圖中,error是指程序無法處理的錯誤,多指系統(tǒng)內(nèi)部比較嚴(yán)重的錯誤。大多數(shù)這類錯誤與開發(fā)人員無關(guān),我們關(guān)注的主要是exception。

    exception主要分為兩塊:運(yùn)行時異常非運(yùn)行時異常。runtimeexception及其子類都稱為運(yùn)行時異常;除此之外, 所有exception的子類異常都是非運(yùn)行時異常。

    運(yùn)行時異常多指程序邏輯上出現(xiàn)問題(也就是我們自己寫代碼邏輯出了問題),常見的錯誤包括 classcastexception:類型轉(zhuǎn)換異常、nullpointerexception:空指針異常、indexoutofboundsexception:越界異常...這些異常都可以通過程序邏輯處理來避免(比如加一個判斷語句判斷是否越界、是否屬于某類型、是否為null),所以編譯器把這些工作交給了程序員來把控,在編譯期即使手動拋出了一個運(yùn)行時異常不去捕獲,編譯器也會通過。因而這類異常也叫做"未檢查異常"(uncheck)。同樣屬于未檢查異常的還有所有的error。即上圖中,所有藍(lán)色框表示未檢查異常,橙色框表示"檢查異常"(check)。對于檢查異常,在可能發(fā)生異常的位置需要用try-catch塊去捕獲并處理,如果不處理它,就會一直向上層調(diào)用拋出,直到被處理為止。

throw 與 throws

    throws關(guān)鍵字主要在方法簽名中使用,用于聲明該方法可能拋出的異常。throws 可以理解成是一種通知行為,沒有實際的拋出異常的動作,而僅僅是告訴調(diào)用他的上層函數(shù),這里可能會拋出這個異常;

    throw用于在函數(shù)體內(nèi)語句中,表示拋出一個實際的異常的實際動作,如果在函數(shù)內(nèi)沒有捕獲并處理,那么將會一直向上拋出這個異常直到被main()/thread.run()拋出。

    當(dāng)一個函數(shù)throws聲明函數(shù)可能拋出一個非運(yùn)行時異常(檢查異常)時,那么即使這個函數(shù)內(nèi)部不顯示使用throw,調(diào)用它的上層函數(shù)也必須包含處理這個異常的代碼。舉個例子:

public class main {

    public static void main(string[] args){

        exceptiontest();
    }
    static int exceptiontest() throws ioexception {
       
        return 0;   
    }
}   

上述代碼中調(diào)用的exceptiontest函數(shù)聲明拋出一個ioexception屬于檢查異常,哪怕exceptiontest函數(shù)中不可能拋出這個異常,調(diào)用它的函數(shù)也必須對此異常做出捕獲處理。現(xiàn)在main函數(shù)中沒有相關(guān)的處理邏輯,所以會編譯錯誤,如下圖:

深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用

    而對運(yùn)行時異常,就是另一種情況了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class main {
 
 public static void main(string[] args){
 
 int i = dividetest(0);
 system.out.println(i);
 }
 static int dividetest(int b) throws arithmeticexception {
 
 int i = 5/b;
 return i;
 }
 }

    同樣在main函數(shù)沒有處理異常的邏輯,這次聲明拋出的異常是arithmeicexception,他屬于運(yùn)行時異常(runtimeexception),所以編譯器對聲明的拋出置之不理:

 深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用

  深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用

  雖然編譯期通過,但在運(yùn)行時程序仍然會自動拋出運(yùn)行時異常,并一直向上拋出到main函數(shù)。而main()中沒有對該異常的捕獲處理,所以主線程終止。

    結(jié)論:我目前的理解是,throws一個運(yùn)行時異常是沒有任何實際意義的,除非你為了遵循某個統(tǒng)一的規(guī)范而這樣做。throws 存在的意義主要是將可能的非運(yùn)行時異常交給編譯器把關(guān),讓編譯器監(jiān)督開發(fā)人員對這些異常進(jìn)行捕獲處理。

    另外,當(dāng)你需要自定義一個異常時,如果需要在編譯期檢查,并在上層統(tǒng)一處理,那么直接繼承exception成為一個檢查異常;如果不需要編譯期檢查,拋出異常表示程序異常需要直接中斷,那么繼承runtimeexception成為一個運(yùn)行時異常即可。

              希望本篇文章可以對各位朋友有所幫助!

原文鏈接:http://www.cnblogs.com/jzb-blog/p/6693434.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产欧美又粗又猛又爽老 | 亚洲视频在线一区二区三区 | 草草视频免费看 | 久久精品国产亚洲AV热无遮挡 | 草草在线视频 | 人人人人人看碰人人免费 | 青青青手机视频在线观看 | 农村妇女野外性生话免费视频 | 国产成人一区二区三区 | 97在线资源站 | 国产精品99精品久久免费 | 美女胸又大又黄又www小说 | 欧美艳星kagney1ynn | 俄罗斯大逼 | 午夜理伦片免费 | 国产一级在线观看 | 四虎影院4hu| 91香蕉导航| 国产精品亚洲一区二区 | 女同学高中你下面好紧 | 无码乱人伦一区二区亚洲 | 国产午夜精品理论片 | 国产自产一区c | 香蕉成人国产精品免费看网站 | 视频免费看 | 日韩精品亚洲专区在线影视 | 韩剧在线观看 | chinese调教踩踏视频 | 免费国产高清视频 | 国产新疆成人a一片在线观看 | 亚洲国产成人精品无码区APP | 国内精品一区二区三区东京 | 精品久久亚洲 | 国产国拍亚洲精品av | 国产老村长足疗店对白 | 欧美人与禽杂交大片 | 特黄一级| 好深快点再快点好爽视频 | 精品国产免费 | 久久人妻无码毛片A片麻豆 久久热这里只有 精品 | 欧美日韩不卡视频 |