2015-05-03 24 views
1

對於下面的方法,是不是還好拋出異常時,它是不是一個「嘗試」塊內?Java中,使用耐摔不try塊

public void setCapacity(x) throws CapacityExceededException { 
    if (x > 10) throw new CapacityExceededException(x); 
    else this.x = x; 
} 
+0

'throw''''' catch'ing(或'try'ing' catch')是不同的東西 – kaykay

回答

2

是的,當它不在try塊內時拋出異常是可以的。你所要做的就是聲明你的方法拋出一個異常。否則編譯器會給出錯誤。

public void setCapacity(x) throws CapacityExceededException { 
    if (x > 10) throw new CapacityExceededException(x); 
    else this.x = x; 
} 

您甚至不必這樣做,如果你CapacityExceededException延長運行時異常。

public void setA(int a) { 
      this.a = a; 
      if(a<0) throw new NullPointerException(); 
     } 

此代碼不會給出任何編譯器錯誤。由於NPE是RuntimeException。

當你拋出一個異常,該異常將被傳播到所謂setCapacity()方法的方法。該方法必須通過try catch來處理異常,或者通過重新拋出它來將它傳播到調用棧中。

0

只需添加一個throws聲明:

public int getCapacity() throws CapacityExceededException { 
    // Something goes here 
} 

否則,你會得到編譯器警告。這將得到拋出異常的方法。但是,只要您執行該方法,就必須使用try塊。這是因爲執行該方法可能會引發異常。

try { 
    getCapacity() 
} catch (CapacityExceededException e) { 
    // Do Something 
} 
+2

只有在沒有從'RuntimeException'繼承的異常時纔會得到編譯器**錯誤** – Diego

+0

因此那麼你不需要在方法中拋出'throws'聲明,你可以拋出它(我對java也很新,所以如果出了什麼問題,可以隨意編輯) – Zizouz212

1

是的,它是確定的。只需要爲方法添加throws子句以防引發檢查異常。對於拋出異常沒有限制的try子句。例如,如果你有一個堆棧,並調用pop()方法和大小爲零,你可以檢查它並拋出一個異常。無論您打算如何調用此方法,都可能需要捕獲異常。否則,這個未捕獲的異常將向上移動調用堆棧,並且最終將由JVM處理,並且它將在System.err流上打印堆棧跟蹤。我們也可以指定自己的處理程序,如果我們想:

public class CustomUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { 
    public void uncaughtException(Thread t, Throwable e) { 
    // Write the custom logic here 
    } 
} 

你甚至都不需要提及的例外拋出,如果它是一個RunTimException

+0

RunTimException?噢親愛的... – Zizouz212

0

......當它不在「try」塊內時拋出異常是否可以?

當然它是!

事實上...那就是拋出異常最常見的方式。

事實上2 ...如果我們不使用異常喜歡,他們將是(幾乎)多餘的,因爲我們可以(幾乎)與「打破標籤」和本地變量來保存異常信息替換它們。


1 - 前提是例外是選中,或者你在方法簽名中聲明它。

2 - 即RuntimeException,Error或後代相同。