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

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

Java - “throws”子句中的異常未從正文中拋出

Java - “throws”子句中的異常未從正文中拋出

慕森王 2021-07-20 15:18:06
我有一個像下面這樣的課程:public class MyClass {    public void foo() throws IOException {        System.out.println("Hola");    }    public MyClass() throws IOException {    }}如您所見,我在方法和構造函數IOException的throws子句中進行了聲明。但我不會在身體的任何地方拋出這個異常。所以它應該是一個編譯時錯誤,就像我們試圖捕獲一個不是從 try 塊拋出的異常一樣。但在這種情況下,它編譯得很好。誰能解釋這種行為背后的原因?
查看完整描述

3 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

聲明throws IOException并不要求您實際拋出異常。

如果是這種情況,那么將無法編程,因為該方法的所有分支都需要拋出異常(即使在非異常情況下)。

這更像是一個擁有完整合約的問題,其中調用者可以處理可能的異常。這適用于可能被迫實際拋出異常的未來實現。
可能出于同樣的原因,允許重寫的方法省略已檢查的異常(您不會被迫拋出它)


查看完整回答
反對 回復 2021-07-29
?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

Show Stopper 有一個很好的答案并引用了一個很好的帖子。這個答案試圖幫助 OP 了解什么是受檢查和未經檢查的異常。


檢查異常是在簽名中聲明的異常(無論是否拋出)。


public void doSomething() throws SomeExtremelyDevastatingEndOfTheWorldException {

    // Maybe it might happen (but whoever calls this MUST acknowledge handle this case)

}

這個應用程序不會編譯,因為作者認為必須處理這種情況才能運行應用程序。


未經檢查的異常是不一定需要處理并且可以在運行時冒泡的異常。


public void doSomething() {

    throws RuntimeException("not the end of the world...but we'll probably want this stacktrace and let the program run on");

}

現在,如果作者希望,任何異常都可以成為未經檢查的異常。


查看完整回答
反對 回復 2021-07-29
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

聲明 throws IOException 不需要該方法拋出異常。


它是方法簽名的一部分,也是設計軟件的一部分。考慮下面的例子。Interface 中有一種方法和它的兩種實現。無論是否拋出異常,兩個實現都應該具有相同的簽名。他們可以忽略異常條款。所以這是編譯器在編譯時無法顯示錯誤的有效原因。


Interface parent { 

    void method() throws Exception

}



Class Implementation1 {

    void method() throws Exception {

        System.out.println("Do not throws exception");

    }

}


Class Implementation2 {

    void method() throws Exception {

        throw new Exception("Error");

    }

}


查看完整回答
反對 回復 2021-07-29
  • 3 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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