閱讀Why can't overriding methods throw exceptions後,我明白,如果方法聲明爲拋出一個經過檢查的異常,在子類中重寫方法只能聲明拋出該異常或它的子類:調用重寫方法拋出經過檢查的異常
class A {
public void foo() throws IOException {..}
}
class B extends A {
@Override
public void foo() throws SocketException {..} // allowed
@Override
public void foo() throws SQLException {..} // NOT allowed
}
所以,因爲SocketException
IS-A IOException
我可以聲明重寫方法作爲拋出IOException
的任何子類。
在我的程序中,我想調用聲明爲throws FileNotFoundException
IS-A IOException
的覆蓋方法。也有try-catch塊
import java.io.*;
class Sub extends Super{
public static void main (String [] args){
Super p = new Sub();
try {
p.doStuff();
}catch(FileNotFoundException e){
}
}
public void doStuff() throws FileNotFoundException{}
}
class Super{
public void doStuff() throws IOException{}
}
Sub.java:6: error: unreported exception IOException; must be caught or declared to be thrown
p.doStuff();
^
是什麼原因呢?我有點困惑,因爲Base類的所有東西都可用於子類。
此外更令人困惑的是能否趕上Exception
和Throwable
除了IOException
(與Overriding概念相反)。
有些人可能會阻止圖像。你也可以在你的問題中複製粘貼編譯錯誤。 – CKing
@CKing現在加入 – Pauwelyn