我對Java的throws和try catch的疑問?

我最在看書的時候又看到這thows和try catch這兩個東西,他們的做用到底是幹什麼的啊!

還有 throws Exception是什麼意思?

Exception和IOException有什麼的差別啊?

請大大們為我詳細解答,我已經在這個部份卡很久了,能的話還請大大們配合一下拿實際上的事情來說明。

實際上的事情可不是什麼的程式喔,而是實務上的一些事情和這兩種的功能有相似的地方,可以說明給我聽一下,謝謝。

已更新項目:

那所謂的「例外事件」是指什麼啊!

2 個已更新項目:

還有啊!throws 和 throw有什麼不一樣啊!

3 個已更新項目:

那個還有啊!在catch的括號裡面一定是填IOException e嗎

4 個已更新項目:

這是我的最後一次問問題了,請問一下throws或throw放在方法名稱的後面是代表它和方法名稱這一行有同樣的執行時間嗎?我說明一點,就是當程式編譯到此方法時,是會一同編譯同一行的throws或throw嗎?

還有把throws或throw放在方法名稱的後面,方法裡的程式都還沒跑到是要怎麼跳到例外執行啊!

還有你說的throws和throw的用法是一定的嗎?是連改都不能改嗎?

method是一定的方法名稱嗎?還是說他只是一個大家認知且認同的方法名稱啊!

5 個已更新項目:

還有在try、catch、Exception等後面都要寫一個例外的程式區段,這些區段都是要我們自己來寫嗎?

之前有一個問是我沒有全部問清楚,就是catch的括號裡不是都會寫IOException e什麼的,那連IOException都能換了,那後面的e 是不是也能換成其他的變數啊!

IOException e的IOException算是 e 的變數型別嗎?

6 個已更新項目:

IOException e的 e 可以用來幹麻,他裡面的東西是數值資料,還是一組的程式,還是什麼的代號,他會有用到的機會嗎?

很抱歉我才給二十點卻問了這麼多,如果閒太少的話,我可以在另外開一個問題。

對你認真的回應我問題的你,我對此感到非常的謝謝。

需要我再開一個問題的話,請說。^_^

2 個解答

評分
  • 1 0 年前
    最佳解答

    這是程式語言的例外處理機制(Exception Handling)。

    所謂的例外(Exception)是指程式在執行時,發生未預期的結果。例如在存取檔案資料時,要讀取的檔案竟然不存在,那麼就會產生FileNotFoundException。

    而例外又有分兩種,一種是受檢例外(CheckedException),另一種是執行期例外(RuntimeException)。

    所謂的受檢例外,是指在撰寫程式時就能夠預期到的例外,像上述的FileNotFoundException,或者Socket網路連線逾時的SocketTimeOutException。這類的例外,在程式撰寫期間就必須Catch到,或再丟出去給其他呼叫者處理,否則程式就不能編譯。舉例來說:

    import java.io.*;

    class Test{

     public static void main(String str){

      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

      String s = reader.readLine();

     }

    }

    這一段程式碼是不能編譯的,因為BufferedReader的readLine( )會拋出IOException。

    (請參考 http://java.sun.com/javase/6/docs/api/java/io/Buff...

    而你可以Catch所產生的IOException,如下:

    import java.io.*;

    class Test{

     public static void main(String str){

      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

      try{

       String s = reader.readLine();

      }

      catch(IOException e){

       e.printStackTrace(); //顯示出堆疊追蹤資料

      }

     }

    }

    這樣便可執行。

    但有時,當你在寫一個Method時,會希望使用這個Method的人知道這個Method有可能拋出例外,需要在撰寫時期就處理,像上面使用到的BufferedReader裡的readLine(),就得在method宣告時,標註這個Method會拋出(throws)例外,如此一來,只要Method裡的例外有被Method拋出,就可以不用在Method裡catch,而是讓Method的呼叫者處理,例如:

    import java.io.*;

    class Test{

     public static void main(String str)throws IOException{ //註明拋出例外

      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

      String s = reader.readLine();

     }

    }

    由於main Method的呼叫者通常是Java platform(當你使用java指令時,Java平台就會去找所執行class的main並呼叫),所以這段程式碼裡的例外會由Java Platform處理。

    你可能會疑惑throws 和 catch,用哪一個方法比較好。實際上這是看情況,其實很明顯的,如果你用throws,就不能自行處理例外,也就是說,你的程式主控權就不在你的method裡,而是還到呼叫者手上,Method裡的程式碼執行到產生Exception就不會繼續執行了。那麼,當Method裡的程式碼發生例外,你就不能決定要怎麼處理它。但這是合理的,因為常常一個Method只負責一件單純的工作,沒有必要去catch例外。

    而catch,通常是放在就算程式發生例外還是必須繼續執行的地方,例如:該輸入數字的地方,使用者輸入文字。你總不希望使用者還沒來得及反悔,程式就因此結束了。

    至於執行期例外(RuntimeException),則是指撰寫時期不會預期到的例外,像是除以0的ArithmeticException,或是型別轉換失敗的ClassCastException。這種例外原則上不用Catch或throws也可以編譯,去不去處理這樣的例外是你可以決定的。

    2008-09-20 13:16:07 補充:

    你可能也會疑惑,該如何去分辯Runtime Exception和Checked Exception。其實很簡單,Runtime Exception是指所有繼承RuntimeException這個類別的例外,詳情請參見:

    http://java.sun.com/javase/6/docs/api/java/lang/Ru...

    而CheckedException則直接繼承於Exception。

    2008-09-20 13:18:56 補充:

    你可能會有更大的疑惑:如何去產生例外。

    你可以用throw來產生例外(看清楚,不是throws)。

    例如,下列是要算平均值的Method:

    public double average(int[] array){

    int sum = 0;

     if(array.length == 0)

      throw new ArithmeticException("array長度為0");

     else{

      for(int i:array)

       sum+=i;

     }

     return aver/(double)array.length; // int 除 int 還是 int,因此要將其中一個數值轉成double

    }

    2008-09-20 13:19:18 補充:

    這個範例可能有點小題大作,但他畢竟是範例,不用太認真。

    因為throw的是ArithmeticException,所以method裡沒有catch或throws來處理,而當陣列長度為0時,程式就會中止,印出錯誤訊息。

    其實還有很細節的,撰寫例外類別的部分,如果有興趣再發問吧。

    2008-09-20 13:24:59 補充:

    抱歉,打得太興奮,忽略了原問題...Orz

    你現在可以看到了,IOException是受檢例外,直接繼承Exception,需要被throws或catch,通常是用來註明產生的例外與Input/Output有關。

    2008-09-20 18:42:55 補充:

    throws 是用來標註一個method有拋出例外

    throw 是在程式碼中 拋出例外

    2008-09-20 18:43:02 補充:

    如果程式碼裡有throw受檢例外,則一定要catch

    像這樣

    public void test( ){

    try{

      throw new IOException( );

     }

     catch(Exception e){

      System.out.println("會執行這一行");

     }

    }

    或用throws 再往外丟也可以

    public void test( )throws Exception{

      throw new IOException( );

    }

    但如果要呼叫這一個method,就一定要catch它throws的Exception。

    2008-09-20 18:52:40 補充:

    至於你要怎麼catch IOException,

    因為Java是物件導向語言,有多型(Polymorphism)的功能,因此你可以catch IOException的父類別Exception或Exception的父類別Throwable

    也就是說

    你可以用

    catch(IOException ioe){}

    catch(Exception e){}

    catch(Throwable t){}

    來處理例外。

    你也可以三個都寫,但是順序要注意,越父層級的例外要放在越後面

    2008-09-20 20:43:49 補充:

    在方法名稱後面寫throws,是指這個方法可能會拋出例外,而且是受檢例外,要呼叫的人一定要catch,這是throws的唯一用法,就是標註一個方法會拋出例外。

    而throw則是在方法中產生例外的指令,要將例外的實體拋出。

    關於throws的用法,請看下列程式碼:

    2008-09-20 20:44:02 補充:

    class Test{

     public void down( )throws Exception{

      throw new Exception( ); //產生一個例外

     }

     public static void main(String arg[]){

      Test t = new Test();

      try{

       t.down( ); //要呼叫down,就得放在try-catch區塊裡,因為它已經說有可能會拋出例外了

      }

      catch(Exception ee){

       System.out.println("呼叫down時接到例外");

      }

     }

    }

    2008-09-20 20:45:16 補充:

    down裡面產生了例外,但down本身並沒有catch它,而是用throws指令讓呼叫者(main)處理例外,因此印出 呼叫down時接到例外。

    所以可以說是 down把自己產生的例外往外拋了,拋給main處理。

    至於method,你是說Method的名稱?我不是很懂你的意思,它直接翻譯成中文稱為方法,在Java裡面稱為Method,在C裡面稱為函數(function),在VB裡稱為子程式(subprogram),最一般性的說法是子程序(subroutine)或程序(procedure)。

    2008-09-20 20:52:41 補充:

    在try、catch、Exception等後面都要寫一個例外的程式區段?

    是的,我試過不寫,但是編譯不會過((殘念

    至於IOException後面的變數,當然是可以任君宣告的,只要遵守變數命名規則就行。你要宣告成 seriousException 或是 e_e_e 都是也是可以的,隨你高興。

    宣告變數的慣例上,字首是小寫就是了。當然也可以不遵守慣例。

    詳情請參閱Java語法慣例:

    http://java.sun.com/docs/codeconv/

    2008-09-20 20:56:54 補充:

    IOException e的IOException算是 e 的變數型別嗎?

    是的,如果你catch的是IOException,那e裡就儲存著IOException型態的資料。

    2008-09-20 20:57:19 補充:

    IOException e的 e 可以用來幹麻?

    你可以看到throw new IOException(); 這串,它所new出來的IOException實體被catch到的話,就會儲存在e裡了。它裡面記錄著許多訊息,包括例外原因,或錯誤訊息,詳情參見http://java.sun.com/javase/6/docs/api/java/lang/Ex...

    你可以在catch裡試試看用 e.printStackTrace(); 在除錯時,這些訊息很管用。

  • Aiolus
    Lv 5
    1 0 年前

    try catch的話是用來捕捉錯誤的的,

    throw Exception是用來丟出錯誤的。

    Exception就如其名:例外,也就是跟正常運行情況有差別,所以才會丟出,可以由使用者或者內建函數丟出。

    IOException繼承自Exception,是進行輸入、輸出處理時所發生的例外事件。

    String filename = "/nosuchdir/myfilename";

    try {

    // 嘗試建立檔案

    new File(filename).createNewFile();

    } catch (IOException e) {

    // 出現錯誤

    System.out.println("不能建立檔案 "+filename+": "+e.getMessage());

    }

還有問題?馬上發問,尋求解答。