3 回答

TA貢獻1796條經驗 獲得超7個贊
該條款是該方法合同的一部分。它要求方法的調用方表現得好像指定的異??赡苡稍摲椒ㄒl(即捕獲異常或聲明自己的子句)。throwsthrows
方法的初始版本可能不會引發子句中指定的異常,但將來的版本可以在不破壞API的情況下引發它(即調用該方法的任何現有代碼仍將通過編譯)。throws
反之亦然。如果用于引發子句中指定的異常的方法,但其將來的版本不再引發該異常,則應保留該子句,以免破壞使用方法的現有代碼。throwsthrows
第一個示例:
假設您有此代碼,它使用:methodB
private static void methodA() {
methodB(); // doesn't have throws IOException clause yet
}
如果以后要改成 throw ,將停止傳遞編譯。methodBIOExceptionmethodA
第二個例子:
假設您有此代碼,它使用:methodB
private static void methodA() {
try {
methodB(); // throws IOException
}
catch (IOException ex) {
}
}
如果從 的未來版本中刪除該子句,將不再通過編譯。throwsmethodBmethodA
當 is 時,此示例不是很有趣,因為它只能在本地使用(在同一類中,可以輕松地修改調用它的所有方法)。methodAprivate
但是,如果它變成 ,則您不知道誰使用(或將使用)您的方法,因此您無法控制由于添加或刪除子句而可能中斷的所有代碼。publicthrows
如果它是一個實例方法,那么即使您不引發異常,也允許該子句的另一個原因 - 該方法可以被重寫,并且重寫方法可能會引發異常,即使基類實現沒有。throws

TA貢獻1875條經驗 獲得超3個贊
因為簽名定義了方法的協定。即使該方法現在沒有拋出IOException,也許將來會拋出IOException,并且您希望為這種可能性做好準備。
假設您現在只是為該方法提供了一個虛擬實現,但是您知道,稍后,實際的實現可能會引發 IOException。如果編譯器阻止您添加此 throws 子句,則在提供該方法的實際實現后,您將被迫(遞歸地)對該方法的所有調用進行返工。

TA貢獻1813條經驗 獲得超2個贊
方法 B 會引發 IOException,因此方法調用 methodB 負責捕獲將由 methodB 引發的異常。嘗試從其他方法調用方法B,它會要求您捕獲它或重新拋出IOException。在某個地方,你將不得不在鏈中捕獲IOException(在try/catch塊中)。所以你不會得到編譯時錯誤。
private void sampleMethod(){ try { methodB(); } catch (IOException e) { // TODO Auto-generate catch block e.printStackTrace(); } }
方法A 中的 try/catch 誠然會吞并異常,這意味著方法 A 負責捕獲 try/catch 塊中的異常。“任何java程序中的每個語句都必須是可訪問的,即每個語句必須至少可執行一次”因此,您將收到編譯器錯誤,因為您的try塊沒有任何代碼來導致IOException。
添加回答
舉報