2013-07-26 34 views
-3

當我加入拋出異常運行或init,我有說了一個錯誤:Java中,嘗試...趕上init或運行

ray.java:115: error run() in xray cannot implement run() in Runnable 

public void run() throws Exception(

     ^

overriden method does not throw Exception 

1 error 

我需要嘗試{..}漁獲量網址起作用。嘗試{...}捕獲需要拋出作品的異常。

+0

閱讀概念委託錯誤。 –

回答

8

Runnable.run()不會引發檢查異常。因此,您不能執行run() throws Exception,因爲它會通過投擲違反合同意外的例外

interface Runnable { 
    // guarantees no checked exception is thrown 
    public void run(); 
} 

class Foo implements Runnable { 
    @Override 
    public void run() throws Exception {} // violates the guarantee 
} 

可以一般做的是相反的(並不適用於Runnable雖然):

interface Foo { 
    // Exception might be thrown, but does not have to 
    public void bar() throws Exception; 
} 

class FooImpl implements Foo { 
    // FooImpl does not throw exception, so you can omit 
    // the throws; it does not hurt if consumer expect an 
    // exception that is never thrown 
    @Override 
    public void bar(); 
} 

解決您的實現問題你要麼必須捕獲並處理的例外(很好的解決方案)或將它包裝成運行時異常(不太好,但不時完成)。運行時異常並不需要在方法簽名中聲明:

class Foo implements Runnable { 
    @Override 
    public void run() { 
    try { 
    } catch (Exception e) { 
     // either handle it properly if you can, or ... 
     throw new RuntimeException(e); 
    } 
    } 
} 
4

編譯錯誤是正確的。您不能將該方法聲明爲拋出檢查的異常。改爲在方法中捕捉異常。

@Override 
public void run() { 
    try { 
     // invoke methods, etc 
    } catch (SpecificException1 se1) { 
     // error handling specific to SpecificException1 
    } catch (SpecificException2 se2) { 
     // error handling specific to SpecificException2 
    } 
    ... 
} 

處理特定異常的順序,以便它們可以相應處理。

0

由於run()原始簽名不拋出任何異常,那麼你就不能拋出checked異常。


作爲一個經驗法則:

  1. 如果超級方法不拋出異常,那麼重寫的方法只能:
    • 不拋出任何異常。
    • 拋出未經檢查的異常。
  2. 如果超級方法拋出未經檢查的異常,那麼它類似於案例1:
    • 不拋出任何異常。
    • 拋出未經檢查的異常。
  3. 如果超級方法拋出檢查異常,然後重寫的方法只能:
    • 不拋出任何異常。
    • 拋出未經檢查的異常。
    • 拋出檢查異常,但它應該是超級方法拋出或子類相同的異常。
0

覆蓋方法必須不拋出檢查新的或比由重寫的方法聲明更廣泛的例外。例如,聲明FileNotFoundException的方法不能由聲明SQLException,Exception或任何其他非運行時異常的方法覆蓋,除非它是FileNotFoundException的子類。

run()的原始方法簽名不會拋出任何異常,因此您無法在您的類中重寫該方法並開始拋出異常。

0

Runnable接口包含void run(),因爲它是這樣定義的,所以不能通過向覆蓋方法添加一個throws Exception來改變它。

0

void run() from Runnable接口不會拋出異常,那就是contract。如果你的代碼在運行時拋出一個異常,或者在那裏處理它,或者讓運行時將它傳遞給層次結構。

0

嘗試this..you不能徹底壓倒一切的run()

public void run(){ 
    try{ 
      //something which CAN throw an exception 
    }catch(Exception e){ 
      e.printStackTrace(); 
    } 
    }