溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中拋出異常和捕獲異常有什么區(qū)別

發(fā)布時間:2021-06-07 14:39:07 來源:億速云 閱讀:944 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹Java中拋出異常和捕獲異常有什么區(qū)別,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

拋出異常:

創(chuàng)建異常對象,封裝異常信息然后通過throw將異常對象傳遞給調(diào)用者。

不對異常進行處理只對異常進行拋出是非常不負(fù)責(zé)任的表現(xiàn)可以稱為渣男。

但是可以通過主動拋出異常對一些jvm虛擬機識別不出來的異常進行拋出。

手動拋出異常舉例

public static void main(String[] args) throws Exception {
        int age = 0;
        age = -100;
        if(age<0)
        {
            Exception e = new Exception();//創(chuàng)建異常對象
            throw e;//拋出異常
        }
        System.out.println(age);
    }

這個例子在常理中年齡是不能小于零的所以要手動拋出異常。

捕獲異常:

對異常進行捕獲然后進行指定方式的處理

throw與throws的區(qū)別:

1.拋出的東西不同:throw拋出的是具體的異常對象,而throws拋出的是抽象的異常類。

2.使用位置不同:throw一般用在方法體中,也可用在代碼塊中,throws只能用在方法聲明括號后面。

Java中的異常處理:何時拋出異常,何時捕獲異常?

在看hadoop源碼時,想想自己最近在做的那個系統(tǒng),發(fā)現(xiàn)很多異常處理的方式不對,還是按照傳統(tǒng)的異常處理方式(即:采用返回值來標(biāo)識程序出現(xiàn)的異常情況)。而hadoop中很多方法的聲明是有異常拋出的,而我的系統(tǒng)中的很多方法的聲明都沒有拋出異常。只是判斷了異常情況,并輸出了錯誤提示,但是并沒有拋出異常。

org.apache.hadoop.hdfs.protocol包下的Block類的readFields()方法:

public void readFields(DataInput in) throws IOException {
    this.blockId = in.readLong();
    this.numBytes = in.readLong();
    this.generationStamp = in.readLong();
    if (numBytes < 0) {
      throw new IOException("Unexpected block size: " + numBytes);//拋出異常,要是的話就不會拋出,而只是System.out.println錯誤提示,
    }

1.如果方法聲明名里面有throws異常,那么方法體里面可以不拋出異常。

因為可以在方法聲明中包含異常說明,但實際上卻不拋出!這樣做的好處是,為異常先占個位置,以后就可以拋出這種異常而不用修改修改已有的代碼。在定義抽象基類和接口時這種能力很重要,這樣派生類或接口實現(xiàn)類就能夠拋出這些預(yù)先聲明的異常。

2.為什么有的方法聲明里面沒有throws,但方法體里面卻拋出了異常?

從RuntimeException繼承的異常,可以在沒有異常說明throws的情況下被拋出!對于Runtime異常(也稱為非檢查的異常unchecked exception),編譯器不需要異常說明。只能在代碼中忽略RuntimeException(及其子類)類型的異常,其他類型的異常的處理都是由編譯器強制實施的。究其原因,RuntimeException代表的是編程錯誤。

3.運行時異常會被Java虛擬機自動拋出!

1. 異常處理基礎(chǔ)

1.1 System.out.println是高代價的。調(diào)用System.out.println會降低系統(tǒng)吞吐量。

1.2 在生產(chǎn)環(huán)境中別用異常的printStackTrace()方法。printStackTrace默認(rèn)會把調(diào)用的堆棧打印到控制臺上,在生產(chǎn)環(huán)境中訪問控制臺是不現(xiàn)實的。

2. 異常處理基本原則

2.1 如果你不能處理異常,不要捕獲該異常。

2.2 如果要捕獲,應(yīng)在離異常源近的地方捕獲它。

2.3 不要吞沒你捕獲的異常。

*(就是捕獲的異常,但是什么也不做)

2.4 除非你要重新拋出異常,否則把它log起來。

2.5 當(dāng)一個異常被重新包裝,然后重新拋出的時候,不要打印statck trace。

2.6 用自定義的異常類,不要每次需要拋出異常的時候都拋出java.lang.Exception。方法的調(diào)用者可以通過throws知道有哪些異常需要處理--所以它是自我描述的。

2.7 如果你編寫業(yè)務(wù)邏輯,對于終端用戶無法修復(fù)的錯誤,系統(tǒng)應(yīng)該拋出非檢查的異常(unchecked exception);如果你編寫一個第三方的包給其他的開發(fā)人員用,對于不可修復(fù)的錯誤要用需要檢查的異常(checked exception)。

2.8 絕對不要因為寫throws語句會讓你用起來不舒服,而不聲明需要檢查的異常。

2.9 應(yīng)用級別的錯誤或不可修復(fù)的系統(tǒng)異常用非檢查的異常(unchecked exception)拋出。

*(注意是錯誤,意味著不可修復(fù),比如配置文件錯誤)

2.10 根據(jù)異常的粒度組織你的方法

以上是“Java中拋出異常和捕獲異常有什么區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI