49
class throwseg1 
{ 
    void show() throws Exception 
    { 
     throw new Exception("my.own.Exception"); 
    } 

    void show2() throws Exception // Why throws is necessary here ? 
    { 
     show(); 
    } 

    void show3() throws Exception // Why throws is necessary here ? 
    { 
     show2(); 
    } 

    public static void main(String s[]) throws Exception // Why throws is necessary here ? 
    { 
     throwseg1 o1 = new throwseg1(); 
     o1.show3(); 
    } 
} 

爲什麼編譯器報告方法show2()show3()main()都必須被捕獲或聲明爲什麼調用函數時必須「拋出異常」?

沒有報告異常引發異常

當我刪除這些方法throws Exception

+2

@PaulTomblin主要肯定可以聲明拋出異常。如果有,JVM將關閉。這與編譯器允許的那樣接近忽略它。 – Taymon 2012-07-21 03:57:35

+0

當被調用的方法(** Methodod1 **)拋出'Exception'時,我們必須用'throws Exception'來定義調用方法(** Method2 **);如果我們沒有在調用方法中傳遞該異常。這樣做的目的是使** Method2 **的調用方法(** Method3 **)可以通過** Method2 **引發異常,並且您應該在此處理它,否則它可能會中斷您的程序。 – Rito 2017-09-11 02:03:50

+0

同樣,如果** Method3 **沒有在它的主體中處理異常,那麼它必須在其方法定義中定義'throws Exception'來提供它的調用方法。以前的評論__extension_ – Rito 2017-09-11 02:11:25

回答

90

在Java中,如您所知,異常可以分爲兩類:一類需要throws子句,或者如果您不指定一個,則必須處理異常。現在,見下圖:

enter image description here

在Java中,你可以扔東西,它擴展了Throwable類。但是,您無需爲所有類指定throws子句。具體而言,可以是ErrorRuntimeException或這兩者的任何子類。在你的情況下,Exception不是ErrorRuntimeException的子類。所以,如果你沒有處理那個特定的異常,它是一個檢查的異常,並且必須在throws子句中指定。這就是爲什麼你需要throws條款。


Java Tutorial來自:

一個例外是一個事件,它的程序,擾亂的程序的指令的正常流動的執行期間發生。

現在,正如您所知異常分爲兩類:已選中和未選中。爲什麼這些分類?

檢查異常:它們被用來表示在程序執行過程中可以恢復的問題。他們通常不是程序員的錯。例如,由用戶指定的文件不可讀,或沒有可用的網絡連接等。在所有這些情況下,我們的程序不需要退出,而是可以採取諸如警告用戶的操作或進入回退機制(如網絡不可用時脫機工作)等。

未經檢查的異常:它們又可以分爲兩個:錯誤和RuntimeException。他們沒有制止的一個原因是他們數量衆多,並且需要處理所有這些都會使我們的程序混亂並降低其清晰度。另一個原因是:

  • 運行時例外:他們通常發生是由於程序員的錯。例如,如果出現除零的ArithmeticException或出現ArrayIndexOutOfBoundsException,這是因爲我們在編碼中不夠細心。他們通常是因爲我們程序邏輯中的一些錯誤而發生所以,在我們的程序進入生產模式之前,它們必須被清除。它們沒有被檢查,因爲我們的程序在發生時必須失敗,以便程序員可以在開發和測試自己時解決它。

  • 錯誤:錯誤是通常程序無法恢復的情況。例如,如果StackOverflowError發生,我們的程序就不能做很多事情,比如增加程序的函數調用堆棧的大小。或者如果發生了一個OutOfMemoryError,我們不能做太多的事來增加我們程序可用的RAM數量。在這種情況下,最好退出程序。這就是爲什麼他們沒有被選中。

有關詳細信息,請參閱:

+0

我從你的答案中得到的是Error類及其子類和RuntimeException類及其子類,它們處於未經檢查的異常(如System.out.println(5/0);不需要拋出,因爲它是一個運行時異常,但我們仍然可以應用try catch)並檢查Exception類,所以我們需要在該方法和每個調用它的方法中聲明throws子句 – Nil 2012-07-21 04:45:43

+0

@ rd4code或者我們必須使用try ... catch來處理它們。 – Jomoos 2012-07-21 04:47:14

+0

還有一個問題:如果將異常分爲未檢查和檢查,特別是未檢查的(運行時錯誤),以避免編譯期間出現更多錯誤? – Nil 2012-07-21 05:04:25

3

Exception是一個檢查異常類。因此,任何調用聲明它的方法的代碼都必須處理或聲明它。

+0

鏈中的每個方法都被聲明爲拋出Exception,包括main。那麼問題在哪裏? – 2012-07-21 04:09:14

+0

@PaulTomblin我問這就是爲什麼有必要在調用函數中寫入throws異常,調用一個引發異常的函數 – Nil 2012-07-21 04:14:12

+0

好吧,我不明白你爲什麼問一個編譯器錯誤,你實際上沒有得到從你發佈的代碼。這是一種奇怪的問道。 – 2012-07-21 04:15:28

18

的Java需要處理或聲明的所有異常。如果你沒有使用try/catch塊處理異常,那麼它必須在方法的簽名中聲明。

例如:

class throwseg1 { 
    void show() throws Exception { 
     throw new Exception(); 
    } 
} 

應該寫成:

class throwseg1 { 
    void show() { 
     try { 
      throw new Exception(); 
     } catch(Exception e) { 
      // code to handle the exception 
     } 
    } 
} 

這樣你就可以擺脫在方法聲明中「拋出異常」宣言。

+3

不是'RuntimeException'的子類的所有異常,即。 – yshavit 2012-07-21 04:25:14

+0

如果有任何其他類像異常被檢查? – Nil 2012-07-21 05:12:56

+1

你是什麼意思?由於所有的異常對象都有「Exception」作爲它們的基類,如果你捕捉到一個「Exception」對象(就像我的例子),它會捕獲拋出的異常。爲了更具體(因爲不同的例外可能需要不同的方式來處理事情),你應該有多個catch塊。 – jebar8 2012-07-21 05:19:04

3

throws Exception聲明跟蹤的可能拋出的預料之中,但不可避免的理由例外方法的自動化方法。聲明是典型地具體說明可能拋出,如throws IOExceptionthrows IOException, MyException異常的一種或多種類型。

我們都已經或將最終編寫意外停止和報告異常,由於某些我們沒有通過零或指數運行的程序,像師出界此前預期的代碼。由於該方法沒有預料到錯誤,因此它們不能被「捕獲」並用try catch子句處理。任何毫無戒心的方法用戶也不知道這種可能性,他們的程序也會停止。

當程序員知道某些類型的錯誤,可能會發生的,但是想處理方法之外,這些例外,該方法可以「拋出」一個或多個類型的異常調用方法,而不是處理它們。如果程序員沒有宣佈該方法(可能)拋出異常(或者,如果Java的沒有宣佈它的能力),編譯器可能不知道,這將是長達瞭解的方法,將來用戶,捕捉並處理該方法可能拋出的任何異常。由於程序可以有許多不同程序編寫的方法層,因此很難(不可能)跟蹤哪些方法可能會拋出異常。

儘管Java有能力聲明異常,但仍然可以編寫一個新的方法,但未處理和未聲明的異常,Java將編譯它,並且可以運行它並希望獲得最佳效果。什麼Java將不會讓你做的就是編譯你的新方法,如果它使用的是已被宣佈爲引發異常(S)的方法,除非你要麼處理異常聲明(一個或多個)在你的方法或聲明的方法拋出相同例外情況或者如果有多個例外情況,你可以處理一些例外情況。

當程序員聲明該方法拋出特定類型的異常時,它只是一種自動的方式來警告其他程序員使用該方法可能會出現異常。然後,程序員可以決定處理異常,或者通過聲明調用方法傳遞相同的異常來傳遞警告。由於編譯器已經被警告,這種新方法中可能出現異常,所以它可以自動檢查未來的新方法調用者是處理異常還是聲明它並強制執行一個或另一個異常。

這種類型的解決方案的好處是,當編譯器報告Error: Unhandled exception type java.io.IOException時,它給出了被聲明爲拋出異常的方法的文件和行號。然後,您可以選擇簡單地通過降壓並聲明您的方法「拋出IOException」。這可以一直執行到主要方法,然後程序停止並向用戶報告異常。但是,最好捕捉異常並以一種很好的方式處理異常,例如向用戶解釋發生了什麼以及如何解決它。當一個方法捕獲並處理異常時,它不再需要聲明異常。可以這麼說,降壓就停在那裏。

相關問題