2010-10-15 199 views
40

你們能解釋什麼是throw,throwsThrowable之間的差異以及何時使用哪個?異常處理:拋出,拋出和拋出

+1

Java有沒有。它有一個Throwable類的'throw'方法,它在方法頭部有一個'throws'關鍵字。他們是兩個完全不同的東西。首先忘掉「拋出」,然後找出拋出的東西。 'throws'只是爲了讓編譯器保持高興。 – 2015-01-09 18:26:16

回答

68
  • throws:編寫方法時,用於申報有問題的方法拋出指定的(檢查)異常。

    與檢查異常相反,可能會拋出運行時異常(NullPointerExceptions等),而無需聲明方法聲明throws NullPointerException

  • throw:指示實際拋出異常。 (或者更具體地說,Throwable)。

    該throw關鍵字後面跟着一個Throwable(通常是一個例外)的引用。

例子:

enter image description here


  • Throwable:你必須爲了創建自己的,定製的,拋出擴展類。

例子:

enter image description here


+0

要將屏幕截圖添加到代碼片段中,請爲您+1。很好的答案。 – 2013-01-22 13:26:11

+2

+1整潔和詳細的說明。 – 0x6900 2014-10-13 06:58:15

+0

哇,詳細解釋的榮譽。 – fruqi 2015-08-14 03:52:41

1

Throw用於拋出異常,throws(如果我猜對了),用來表示該方法可以拋出特定的異常,而Throwable類是所有錯誤和異常的在Java

How to Throw Exceptions

2

擲 - 它是用來拋出Exception.The throw語句需要一個參數:可拋出類對象

拋出 - 這是用來指定方法可以拋出異常

Throwable - 這是Java語言中所有錯誤和異常的超類。您只能拋出從Throwable類派生的對象。拋出包含在其創建

9
  • throw時間的線程的執行堆棧的快照:聲明拋出對象t其中t instanceof java.lang.Throwable必須是真實的。
  • throws:通過該方法指定檢查異常的方法簽名令牌throw
  • java.lang.Throwable:可以引發(並捕獲)的所有對象的父類型。

See here for a tutorial on using exceptions.

+0

+1爲膠囊答案。 – 0x6900 2014-10-13 09:33:02

5

這很容易理解。

java.lang.Throwable的

Throwable類是 所有錯誤,並在Java語言 異常的超類。只有 對象是此類 類(或其某個子類)的實例爲 的Java虛擬機或 可引發的Java throw語句。 類似地,只有這個類或其中的一個 其子類可以是catch子句中的參數 類型。 More

的關鍵詞拋出在方法聲明中使用,這說明什麼樣的異常[Throwable的類]我們可能期望從這一方法。

關鍵詞throw用於拋出Throwable類實例的對象。


恐怕看到一些例子:

我們創造我們自己的異常類

public class MyException super Exception { 

} 

的,我們創建一個從我們的異常類創建一個對象,並拋出一個方法它使用關鍵字throw

private void throwMeAException() throws MyException //We inform that this method throws an exception of MyException class 
{ 
    Exception e = new MyException(); //We create an exception 

    if(true) { 
    throw e; //We throw an exception 
    } 
} 

當我們要使用的方法throwMeAException(),我們不得不照顧它在特定的方式,因爲我們有它拋出的東西,在這種情況下,我們有三個選擇的信息。

使用塊try和catch來處理異常

第一種選擇:

private void catchException() { 

    try { 
    throwMeAException(); 
    } 
    catch(MyException e) { 
    // Here we can serve only those exception that are instance of MyException 
    } 
} 

第二個選項是通過異常

private void passException() throws MyException { 

     throwMeAException(); // we call the method but as we throws same exception we don't need try catch block. 

    } 

第三個選項是捕捉並重新拋出異常

private void catchException() throws Exception { 

    try { 
    throwMeAException(); 
    } 
    catch(Exception e) { 
     throw e; 
    } 
} 

恢復,當您需要停止某些操作時,您可以拋出將返回的異常,直到不是某個try-catch塊的服務器。無論您使用哪種方法引發異常,您都應該通過try-catch塊來處理它,或者將聲明添加到方法中。

這條規則的例外是java.lang.RuntimeException那些不需要聲明。這是異常使用方面的另一個故事。

+0

很好的例子。感謝您花時間和精力向我解釋這一點。 – Sumithra 2010-10-15 09:00:38

1

投擲:

用於實際拋出異常,而拋出是聲明的方法。它們不可互換。

throw new MyException("Exception!); 

拋出:

這是當你沒有在你的代碼中使用的try catch語句中使用,但你知道,這個特殊的類是能夠投擲某某異常(只檢查例外)。在這裏,你不使用try catch塊,而是在你的代碼的適當位置使用throw子句來寫入,並且拋出異常給方法的調用者並由它處理。當函數可能拋出檢查異常時,也會使用throws關鍵字。

public void myMethod(int param) throws MyException 
-1

相同的答案同上,但與複製粘貼樂趣

public class GsonBuilderHelper { 
    // THROWS: method throws the specified (checked) exception 
    public static Object registerAndRun(String json) throws Exception { 

     // registering of the NaturalDeserializer 
     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer()); 
     Gson gson = gsonBuilder.create(); 

     Object natural = null; 
     try { 
      // calling the NaturalDeserializer 
      natural = gson.fromJson(json, Object.class); 
     } catch (Exception e) { 
      // json formatting exception mainly 
      Log.d("GsonBuilderHelper", "registerAndRun(json) error: " + e.toString()); 
      throw new Exception(e); // <---- THROW: instance of class Throwable. 
     } 
     return natural; 
    } 
} 
1

在Java中Throwable :,所有的錯誤的和execption的類是從java.lang.Throwable的類drieved。它是錯誤和例外類的層次結構的頂部。只有作爲此類(或其某個子類)的實例的對象由Java虛擬機拋出,或者可以由Java throw語句拋出。

Throws:是post-method修飾符,並指定該方法可能拋出哪些執行選項。如果它們是檢查異常,編譯器將保證調用該方法的代碼必須捕獲這些檢查的異常。

Throw:語句用於引發錯誤或異常。 throw語句需要一個參數:Throwable類或Throwable類的任何子類的實例。執行throw語句會觸發JVM引發此異常並導致發生異常。

1

列出幾個...

  1. 的Java throw關鍵字用來明確throw異常。
  2. 只有使用throw才能傳播檢查異常。
  3. Throw後面是一個實例。
  4. Throw在該方法內使用。
  5. 您不能throw多個例外。

拋出

  1. 的Java throws關鍵字來聲明一個例外。
  2. 檢查異常可以用throws傳播。
  3. Throws其次是類。
  4. Throws與方法簽名一起使用。
  5. 您可以聲明多個例外 public void method()throws IOException,SQLException
0

有兩種主要類型的例外:
運行時例外(未選中):例如。 NullPointerException,ClassCastException,..
檢查異常:例如。 FileNotFoundException,CloneNotSupportedException,..

運行時異常是在運行時發生的異常,開發人員不應該試圖捕捉它或停止它。只有編寫代碼才能避免它們,或者在滿足錯誤條件時發出命令throw。我們在方法體內使用throw。

public Rational(int num, int denom){ 
if(denom <= 0) { 
    throw new IllegalArgumentException("Denominator must be positive"); 
} 
this.num=num; 
this.denom=denom; 
} 

然而,對於檢查異常,在JVM希望你來處理它,並給編譯錯誤,如果沒有處理好,所以你聲明它拋出作爲clone()方法在下面看到,異常的類型。

Class Employee{ 
public Employee clone() throws CloneNotSupportedException{ 
    Employee copy = (Employee)super.clone(); 
    copy.hireDate = (Date)hireDate.clone(); 
    return copy; 
} 
}