亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么編譯器允許拋射,而方法永遠不會拋出異常

為什么編譯器允許拋射,而方法永遠不會拋出異常

撒科打諢 2022-09-01 19:53:41
我想知道為什么java編譯器允許在方法聲明中拋出,而方法永遠不會拋出異常。因為“throws”是處理異常的一種方式(告訴調用方處理它)。由于有兩種處理異常的方法(throws和try/catch)。在 try/catch 中,它不允許捕獲未在 try 塊中引發的異常,但它允許在可能不會引發異常的方法中引發。private static void methodA() {    try {        // Do something        // No IO operation here    } catch (IOException ex) {  //This line does not compile because                              //exception is never thrown from try        // Handle       }}private static void methodB() throws IOException { //Why does this //compile when excetion is never thrown in function body    //Do Something     //No IO operation}
查看完整描述

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


查看完整回答
反對 回復 2022-09-01
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

因為簽名定義了方法的協定。即使該方法現在沒有拋出IOException,也許將來會拋出IOException,并且您希望為這種可能性做好準備。

假設您現在只是為該方法提供了一個虛擬實現,但是您知道,稍后,實際的實現可能會引發 IOException。如果編譯器阻止您添加此 throws 子句,則在提供該方法的實際實現后,您將被迫(遞歸地)對該方法的所有調用進行返工。


查看完整回答
反對 回復 2022-09-01
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

  1. 方法 B 會引發 IOException,因此方法調用 methodB 負責捕獲將由 methodB 引發的異常。嘗試從其他方法調用方法B,它會要求您捕獲它或重新拋出IOException。在某個地方,你將不得不在鏈中捕獲IOException(在try/catch塊中)。所以你不會得到編譯時錯誤。

    private void sampleMethod(){ try { methodB(); } catch (IOException e) { // TODO Auto-generate catch block e.printStackTrace(); } }

  2. 方法A 中的 try/catch 誠然會吞并異常,這意味著方法 A 負責捕獲 try/catch 塊中的異常。“任何java程序中的每個語句都必須是可訪問的,即每個語句必須至少可執行一次”因此,您將收到編譯器錯誤,因為您的try塊沒有任何代碼來導致IOException。


查看完整回答
反對 回復 2022-09-01
  • 3 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號