我想拋出異常返回調用一個。所以我抓住了異常並投擲它。同時拋出它要求我圍繞try catch塊中的語句。在catch塊中拋出異常請求另一個try catch塊
catch(IOException e){
throw new Exception(e);//ask me to surround with try catch
}
只是想知道爲什麼這樣說。
我想拋出異常返回調用一個。所以我抓住了異常並投擲它。同時拋出它要求我圍繞try catch塊中的語句。在catch塊中拋出異常請求另一個try catch塊
catch(IOException e){
throw new Exception(e);//ask me to surround with try catch
}
只是想知道爲什麼這樣說。
是的,你正在捕捉IOException
而你想拋出一個Exception
。你必須添加throws Exception
方法。
public void myMethod() throws Exception{
try{
// implementaion
}catch(IOException e){
throw new Exception(e);
}
}
您的方法簽名可能沒有定義爲拋出異常。將throws Exception
添加到您的方法,它應該工作。
否則
您只能扔的Exception
一個子類,但沒有父母Exception
這是不能接受的。因此你需要捕捉它或明確地拋出。
這是因爲Exception
是checked。你需要重新拋出RuntimeException
的子類。通常IllegalArgumentException
或IllegalStateException
使用
public void myMethod(){
try{
// implementaion
}catch(IOException e){
LOG.error(e);
throw new IllegalArgumentException("Bad file: ", e);
}
}
您需要聲明由您的方法拋出的期望exeption類型。請注意,拋出一個簡單的Exception
類實例是一個非常糟糕的主意。
public void myMethod() throws Exception {
try {
// Do something that may cause an IOException
} catch(IOException e){
throw new Exception(e);
}
}
當你扔的Exception
(一個不屬於任何子類的實例)的實例,你真的不能做專門的異常處理。方法簽名中的throws Exception
聲明很可能會像疾病一樣在您的類層次結構中級聯。考慮拋出一個更具體(可能是自定義)的實例Exception
。
在某些情況下,可能無法處理由它最初拋出的標準Java類引發的異常,但使用下面的代碼,而把它返回給調用者可行:
public void myMethod() throws IOException {
// Do something that may cause an IOException
}
由於其他人指出,你的方法簽名需要說明它會拋出什麼樣的異常類型。
但更重要的是,如果您未創建新的特定類型的異常,則不需要新的另一個異常。只要重新拋出一個你抓到的那個throw e;
。
或者如果你不打算對它做任何事情,不要打擾它,讓它冒泡。
本例中捕捉異常的用法是什麼? IOException是Exception的一個子類。爲什麼不去除catch塊? – Mikhail
@Mikhail有時您可能希望向封閉實例添加自定義異常消息。 – Kallja