国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【JAVA系列】關(guān)于異常的一些事

不知名網(wǎng)友 / 1444人閱讀

摘要:程序塊若有異常發(fā)生,程序的運行便重點,并拋出異常類所產(chǎn)生的對象。關(guān)鍵字我們可以使用關(guān)鍵字把可能拋出的異常顯式的標注在方法定義的位置從而提醒調(diào)用者要注意捕獲這些異常。


前言

JAVA提供強大的異常處理機制,在Java中,所有的異常都會被封裝到一個類中,程序出錯時會將異常拋出。


一、如何知道程序錯誤

代碼中的錯誤是客觀存在的,沒有十全十美的代碼,代碼多到一定程序,我們就需要不斷維護、檢查代碼的錯誤,確保健壯性。

在Java中,我們有以下兩種方式告訴程序代碼發(fā)生錯誤:

  1. LBYL: Look Before You Leap. 在操作之前就做充分的檢查
  2. EAFP: It’s Easier to Ask Forgiveness than Permission. “事后獲取原諒比事前獲取許可更容易”. 也就是先操作, 遇到問題再處理.

簡單來說就是第一種沒有使用異常,第二采用了異常的方法

代碼風格如下:

LBYL: Look Before You Leap. 在操作之前就做充分的檢查:

boolean ret = false;ret = 登陸游戲();if (!ret) { 處理登陸游戲錯誤;    return; }ret = 開始匹配();if (!ret) { 處理匹配錯誤;    return; }ret = 游戲確認();if (!ret) { 處理游戲確認錯誤;    return; }ret = 選擇英雄();if (!ret) {    處理選擇英雄錯誤;    return; }ret = 載入游戲畫面();if (!ret) { 處理載入游戲錯誤;    return; }......

It’s Easier to Ask Forgiveness than Permission. “事后獲取原諒比事前獲取許可更容易”. 也就是先操作, 遇到問題再處理:

try {    登陸游戲();    開始匹配();    游戲確認();    選擇英雄();    載入游戲畫面();   ...} catch (登陸游戲異常) {    處理登陸游戲異常;} catch (開始匹配異常) { 處理開始匹配異常;} catch (游戲確認異常) { 處理游戲確認異常;} catch (選擇英雄異常) { 處理選擇英雄異常;} catch (載入游戲畫面異常) { 處理載入游戲畫面異常; }.....

對比兩種不同風格的代碼, 我們可以發(fā)現(xiàn):

使用第一種方式, 正常流程和錯誤處理流程代碼混在一起, 代碼整體顯的比較混亂.

而第二種方式正常流程和錯誤流程是分離開的, 更容易理解代碼

二、常見的異常

所謂異常指的就是程序在 運行時出現(xiàn)錯誤時通知調(diào)用者的一種機制

異常的種類有很多, 不同種類的異常具有不同的含義, 也有不同的處理方式,下面介紹幾種常見異常:

1.算術(shù)異常

public static void main(String[] args) {        //1.算術(shù)異常        System.out.println(10/0);    }

2.數(shù)組越界異常

public static void main(String[] args) {        int []arr=new int[4];        System.out.println(arr[10]);    }

3.空指針異常

public static void main(String[] args) {        String str=null;        System.out.println(str.length());    }

二、異常的基本用法

1.如何捕獲異常

異常處理是由try、catch與finally等3個關(guān)鍵字組成的程序塊。
其異常的基本語法:

try{		要檢查的程序語句;		...		}catch(異常類 對象名稱){		異常發(fā)生時的處理語句;		}[catch(異常類 對象名稱){		異常發(fā)生時的處理語句;		}catch(異常類 對象名稱){		異常發(fā)生時的處理語句;		}		...][finally{		一定會運行到的程序代碼;		}]			

異常的處理流程如下:

  1. 首先,我們把所有可能發(fā)生異常的語句都放到一個try之后由{}所形成的區(qū)塊,這個區(qū)塊稱為“try區(qū)塊”。程序通過try{}區(qū)塊準備捕捉異常。try程序塊若有異常發(fā)生,程序的運行便重點,并拋出“異常類所產(chǎn)生的對象”。
  2. 拋出的對象如果屬于catch()括號內(nèi)欲捕獲的異常類,catch則會捕捉此異常,然后進入catch的塊里繼續(xù)運行。
  3. 無論try程序塊是否捕捉到異常,或者捕捉到的異常是否與catch()括號內(nèi)的異常相同,最終一定會運行finally塊里的程序代碼。

【注意】
finally塊時可以省略的,如果省略了finally塊,那么在catch()塊運行結(jié)束后,程序?qū)⑻絫ry-catch塊之后繼續(xù)執(zhí)行。

流程圖如下:
下面看一個例子:
不進行異常處理:

public static void main(String[] args) {        int[] arr = {1, 2, 3};        System.out.println(arr[10]);           }


使用異常處理就能正常編譯:

 public static void main(String[] args) {        int[] arr = {1, 2, 3};        try{            System.out.println(arr[10]);        }catch (ArrayIndexOutOfBoundsException e){            System.out.println("我在這里捕捉到一個異常");        }        System.out.println("hello!!!");    }


如果我想要知道詳細的異常信息的話,則需要使用異常對象的printStackTrace()方法:


【異常處理機制小結(jié)】
當異常發(fā)生時,通常用兩種方法處理:

  1. 一種時交由Java默認的異常處理機制做處理。但這種處理方式,Java通常只能輸出異常信息,接著便終止程序的運行
  2. 一種時用自行編寫的try-catch-finally塊來捕捉異常,這樣的好處是可以靈活操控程序的流程,做出最適當?shù)奶幚怼?/li>

2.異常類的處理流程

習慣上將Error類與Exception類統(tǒng)稱為異常類,但二者本質(zhì)上是不同點。
Error類通常指的是Java虛擬機出錯,用戶無法在程序里處理這種錯誤。
Exception類包含了一般性的異常,這些異常在捕捉到之后便可做妥善的處理,以確保程序繼續(xù)運行。

下面是異常處理的流程:

  1. 如果程序發(fā)生異常,那么會自動地由JVM根據(jù)異常的類型,實例化一個指定異常類的對象,如果這個時候程序之中沒有任何的異常操作,則這個異常類的實例化對象將交給JVM進行處理——進行異常信息的輸出,而后中斷程序執(zhí)行
  2. 如果程序之中存在異常處理,則會由try語句捕獲產(chǎn)生的異常類對象;然后將該對象與try之后的catch進行匹配,如果匹配成功,則使用指定的catch進行處理,如果沒有匹配成功,則向后面的catch繼續(xù)匹配,如果沒有任何的catch匹配成功,則這個時候?qū)⒔唤oJVM執(zhí)行默認處理。
  3. 不管是否有異常都會執(zhí)行finally程序,如果此時沒有異常,執(zhí)行完finally,則會繼續(xù)執(zhí)行程序之中的其他代碼,如果此時有異常沒有能夠處理(沒有一個catch可以滿足),那么也會執(zhí)行finally,但執(zhí)行完finally之后,將默認交給JVM進行異常信息的輸出,并且程序中斷。

3.throws關(guān)鍵字

我們可以使用 throws 關(guān)鍵字, 把可能拋出的異常顯式的標注在方法定義的位置. 從而提醒調(diào)用者要注意捕獲這些異常。
格式如下:

訪問權(quán)限 返回值類型 方法名稱(參數(shù)列表)throws 異常類{	//方法體;}

上面格式包括兩個部分:一個普通方法的定義,與方法定義模式無區(qū)別。方法后面緊跟”throws異常類“,它位于方法體{ }之前,用來檢測當前方法是否有異常,若有,則將該異常提交給直接使用這個方法的方法。

 //定義私有化靜態(tài)方法,并使用throws拋出異常    //一旦方法出現(xiàn)異常,setZero()方法自己并不處理,而是將異常提交給它的上級調(diào)用這main()方法    private static void setZero(int[] arr,int index)throws ArrayIndexOutOfBoundsException{        arr[index]=0;    }    public static void main(String[] args) {        int []arr=new int[5];        try{            setZero(arr,10);        }catch (ArrayIndexOutOfBoundsException e){            System.out.println("數(shù)組超出綁定方位!");            System.out.println("異常:"+e);        }        System.out.println("main()方法結(jié)束!");    }

4.throw關(guān)鍵字

上面的所有異常類對象全部都是由JVM自動實例化的,但優(yōu)勢我們也想能進行異常類對象的實例化操作,手工拋出異常,則此時需要throw關(guān)鍵字。

public static void main(String[] args) {        try {            //拋出異常的實例化對象            throw  new ArrayIndexOutOfBoundsException("/n我是手工異常:/n數(shù)組下標越界");        }catch (ArrayIndexOutOfBoundsException e){            System.out.println(e);        }    }

三、自定義異常類

為了處理各種異常,Java可通過繼承的方式運行用戶編寫自己的異常類,因為所有可處理的異常均繼承自Exception類,因此自定義異常類也不例外。

語法如下:

class 異常名稱 extends Exception{...}

我們可以在自定義異常類里編寫方法處理相關(guān)時間,甚至不編寫任何語句也可以正常工作,因為父類Exception已提供相當豐富的方法,通過幾次子類均可以使用它們。

static class MyException extends Exception{        public MyException(String msg){            super(msg);//調(diào)用Exception類的構(gòu)造方法,存入異常信息        }    }    public static void main(String[] args) {        try{            throw new MyException("自定義異常");        } catch (MyException e) {            e.printStackTrace();            System.out.println(e);        }    }


最后

前路漫漫啊,前路漫漫啊…

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/125643.html

相關(guān)文章

  • 【面試】Java基礎(chǔ)中那些-One

    摘要:前言面試中對于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優(yōu)勢,本系列將講述一些面試中的事,不會很詳細,但是應該比較全面吧。 前言 面試中對于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優(yōu)勢,本系列將講述一些java面試中的事,不會很詳細,但是應該比較全面吧。 主要內(nèi)容 說到...

    Stardustsky 評論0 收藏0
  • Java 最困擾你那些

    摘要:沒有操作符重載。最終類型在所有情況下應該是默認的,并用作為修飾符。這樣就會減少現(xiàn)在你會在和一些第三方的中見到的那些令人困惑的歷史遺留方法。在用過或是最新的之后你會覺得非常的繁瑣。這是最常見的關(guān)于的吐槽,但它這就是事實。 啊哈Reddit,沒了你我們還能在哪里從魚目混珠的網(wǎng)絡(luò)中提煉真正的精華?就在這雜亂無章的論壇中,的的確確存在著這樣一些精辟的討論。 比如有個叫Shambloroni的...

    Lorry_Lu 評論0 收藏0
  • 后端知識拓展 - 收藏集 - 掘金

    摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統(tǒng)的線程進程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個月的業(yè)余時間用 Laravel 開發(fā)了一個項目,在此之前,除了去年換工作準備面試時,我并...

    CoderBear 評論0 收藏0
  • 后端知識拓展 - 收藏集 - 掘金

    摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統(tǒng)的線程進程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個月的業(yè)余時間用 Laravel 開發(fā)了一個項目,在此之前,除了去年換工作準備面試時,我并...

    Carl 評論0 收藏0
  • Thread類源碼解讀(3)——線程中斷interrupt

    摘要:現(xiàn)在終止一個線程,基本上只能靠曲線救國式的中斷來實現(xiàn)。中斷機制的核心在于中斷狀態(tài)和異常中斷狀態(tài)設(shè)置一個中斷狀態(tài)清除一個中斷狀態(tài)方法同時會返回線程原來的中斷的狀態(tài)。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執(zhí)行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...

    fevin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<