關於java異常處理的幾個關鍵字 try catch/throw/throws

來源:互聯網
上載者:User

http://hi.baidu.com/woaini5730/blog/item/eda79509511cdcc83bc763a7.html

 

 

 

throws是用來聲明一個方法可能拋出的所有異常資訊
throw則是指拋出的一個具體的異常類型。
通常在一個方法(類)的聲明處通過throws聲明方法(類)可能拋出的異常資訊,而在方法(類)內部通過throw聲明一個具體的異常資訊。
throws通常不用顯示的捕獲異常,可由系統自動將所有捕獲的異常資訊拋給上級方法;
throw則需要使用者自己捕獲相關的異常,而後在對其進行相關封裝,最後再將封裝後的異常資訊拋出。
對異常處理方式不同.throws對異常不處理,誰調用誰處理,throws的Exception的取值範圍要大於方法內部異常的最大範圍,而cathch的範圍又要大於throws的Exception的範圍;throw 主動拋出自訂異常類對象. throws拋出的是類,throw拋出的是對象.

在方法定義中表示的是陳述語氣,第三人稱單數,throw 顯然要加s。(throws 一般用作方法定義的子句)
在函數體中要用throw,實際上是祈使句+強調,等價於DO throw ....,do +動詞原形

throw 用於引發異常,可引發預定義異常和自訂異常。

I)異常中“throws”和“throw”的區別:

throw 是個“動詞”,緊接在try語句塊之後。
而throws 是“名詞” ,用在函數方法名後 function A () throws Exception e {}
throw用在程式中明確表示這裡拋出一個異常。throws用在方法聲明的地方,表示這個方法可能會拋出某異常。
throw用來拋出實際的異常, 後面要跟一個異常對象(執行個體), 是一個實際的語句
throws是用來聲明的, 加在方法聲明的後面, 後面跟一個異常類的名字, 表示一般性動作而不是特指某一個動作.

使用throws是來說明,當前的函數會拋出一個異常。
在一般的情況下,你調用的一些函數會拋出一些異常。但是你又不想在當前的context中去處理它,就可以聲明該函數會拋出該異常,這樣你就不用去try-catch它了。當出現該異常,該函數會拋出此異常,讓上一層的函數去處理。throws也稱異常規範
public static h() throws
{
     try
     {
         a.g();
     }
     catch(Exception e)
     {
         throw e;
     }
}
因為你沒有對這個異常處理,而是簡單的拋出了。
而單純的聲明
public static h() throws
{
     a.g();
}
也會拋出這個異常
II)try catch /throws /throw

throws如果發生了對應的錯誤後,下邊的的確不會被執行;
try catch的理解應該辯證點看:如果catch後沒有再次throw出去,那會繼續執行;要想不執行必須throw處理
throws   拋出異常,解決不了再向上,直道碰到能解決這個異常的處理常式,就好像你的上司讓你執行一項任務,中途你遇到問題不知道如何解決,你把問題返還給你的上司,認為既然是T分配的任務就該知道如何解決這個問題,你的上司無法解決同樣把它送給經理解決,依次向上,直到有人能解決這個問題為止(不想自己另外寫代碼處理異常時非常有用)
try catch    則是考慮到try包含這段代碼可能會遇到這種異常,直接用catch捕獲處理,catch包含的代碼為處理代碼

throws 只是把一個異常拋出去了,如果你的上層代碼有處理方式,就由上層代碼來處理這個異常。
而try/catch對是清楚的知道該操作可能出現什麼異常,同時在catch塊中應該有處理的方法。
而且還有一種方式就是try/catch/finaly的方式。

Throws是把異常返回給調用者,由調用者處理,調用者還是要try/catch,跑不掉的
catch中就一個簡單的SYSTEM.OUT.PRINTLN(…………);還有,串連資料庫時會串連不上,你也不知道是驅動問題、電腦問題還是網路問題,發給使用者,使用者也看不懂,所以統統throws給catch,提示請與管理員聯絡。。。。。。這就簡單多了

throws 寫在方法簽名後,
throw 寫在方法體內,可以寫在if()....
也可以catch住一個exception後立刻又把他throw 出去,什麼處理也不做,還可以catch住後throw new 一個你自己定義的exception ....

throws 就是把異常拋出,但是在以後要不有個catch接受,要不就拋給主函數.就是逐級往上一級拋,直到有一個接受他的

Throws拋出異常交給調用該方法的方法 處理,即:
public class Test{
    public static void main(String[] args){
        Test2 test2 = new Test2();
        try{
           System.out.println("invoke the method begin!");
           test2.method();
           System.out.println("invoke the method end!");
        }catch(Exception e){
           System.out.println("catch Exception!");
        }
    }
}

class Test2{
    public void method() throws Exception{
        System.out.println("method begin!");
        int a = 10;
        int b = 0;
        int c = a/b;
        System.out.println("method end!");
    }
}

很明顯,答案出來了:
invoke the method begin!
method begin!
catch Exception!

finally語句是任選的,try語句後至少要有一個catch或一個finally,finally語句為異常處理提供一個統一的出口,不論try代碼塊是否發生了例外狀況事件,finally塊中的語句都會被執行
在覆蓋的方法中聲明異常
在子類中,如果要覆蓋父類的一個方法,或父類中的方法聲明了throws異常,則子類的方法也可以拋出異常,但切記子類方法拋出的異常只能是父類方法拋出的異常的同類或子類。
如:
import java.io.*;
class A {
public void methodA()throws IOException{
.....
}
}
class B1 extends A {
public void methodA()throws FileNotFoundException{
....}
}
class B2 extends A {
public void methodA()throws Exception{//Error
....}
}

public void method() throws Exception {
try {
      具體程式
} catch(Exception ex) {

}
}
如果具體程式出錯的話,將處理下面程式體中catch的地方,這個時候throws Exception 其實是沒有意義的。
public void method() throws Exception {
try {
      具體程式
} catch(FileNotFoundException ex) {

}
}

如果具體程式出錯的話,且是FileNotFoundException 的情況下,將處理下面程式體中catch的地方處理。
這個時候FileNotFoundException 以外的Exception 將通過 throws Exception ,throw到上一層。

throw寫在方法體內, throws寫在方法名的後面
throw關鍵字的格式:throw new ArithmeticException(); 拋出一個異常,這些異常可以使unchecked exception(也就是RuntimeException),也可以是checked execption. throw必須有一個捕獲該異常的try/catch語句
throws關鍵字的格式
private void arrayMethod(int[] arr)
           throws ArrayIndexOutOfBoundsException,
                  ArithmeticException {
     //   Body
}
throws子句列出了方法可能拋出的異常類型,除了Error和RuntimeException異常,方法中可能拋出的異常必須在throws列表中聲明,否則就會出現編譯錯誤。
例如:假如方法中可能拋出IllegalAccessException(屬於checked execption)則必須在throws列表中聲明。

系統異常是預設拋出的,自己定義的異常要顯示拋出

還有一些是庫方法只throw 沒有處理的,所以表面上你看到沒有throw也catch到異常

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.