2017-07-06 208 views
0

當一個方法拋出一個異常時,它會搜索調用堆棧以查找處理程序權限?從這個意義上說,爲什麼exep.second();?儘管我在方法second()中發現了異常。這裏是我的代碼:異常處理錯誤

public class Exep { 
void first()throws IOException{ 
    throw new IOException("device error"); 
} 
void second()throws IOException{ 
    try{ 
     first(); 
    }catch(Exception e){ 
     System.out.println(e); 
    } 
} 
public static void main(String args[]){ 
    Exep exep = new Exep(); 
    exep.second(); 
} 

}

但在加入錯誤消失拋出IOException異常的main()。爲什麼?

+0

您能告訴我們預期的產量和實際產量嗎? – byxor

+3

'IOException'是一個檢查異常。編譯器不知道你對'exep.second()'的調用不會拋出一個,所以你的代碼不能編譯。 – jsheeran

+0

@byrox我正在學習異常處理,我只是想在發現異常時打印「設備錯誤」。 – Vyshak

回答

2

IOException是一個檢查異常,因此必須以某種方式處理。爲主要添加throws IOException會抑制此行爲,但這不是一種好的做法。

second(),你捕獲所有異常從first(),但你仍然包括的second()聲明的throws IOException。這不是必需的,因爲您可以保證first()引發的任何異常都會在second()中被捕獲和處理。

更多閱讀:Exceptions

1

如果你聲明void second() throws IOException然後你調用main方法,你需要捕獲這個方法可能拋出的異常,就像你用first()方法一樣。在這種情況下,您根本不需要second()中的throws子句。

1

您明確聲明方法second()引發異常。編譯器不知道異常實際上是在方法中被捕獲的。將catch部分移至main(),錯誤將消失。或者更好,刪除throws聲明,因爲你沒有扔任何東西。

0

您正在告訴編譯器second()會拋出IOException,但是當您調用second()時,您並未將其封裝在try/catch塊中。如果你想離開它,那麼你需要在你的main中包含一個try catch塊。

但是,正如您所擁有的,您絕不會從second()內部拋出異常,因此您可以從那裏刪除行throws IOException