2015-07-10 88 views
0

我不斷地收到錯誤:TestException.java:8:error:unreported exception Throwable;必須捕獲或聲明拋出Java中自定義異常的問題

throw new ParentException().initCause(new ChildException().initCause(new SQLException()));

任何想法,我知道有些小事是缺少這我沒有得到容易在我看來,謝謝,不要拿來源爲面值,我試圖以增加我的理解。

import java.sql.SQLException; 

    public class TestException{ 

    public static void main(String[] args) { 

    try{ 
      throw new ParentException().initCause(new ChildException().initCause(new SQLException())); 
    } 
    catch(ParentException | ChildException | SQLException e){ 
      e.printStackTrace(); 
      try{ 
        Thread.sleep(10*1000); 
      } 
      catch(Exception et){ 
        ; 
      } 
    } 

    } 
} 

    class ParentException extends Exception{ 

    public ParentException(){ 
      super("Parent Exception is called"); 
    } 

} 

class ChildException extends Exception{ 

    public ChildException(){ 
      super("Child Exception is called"); 
    } 

} 
+0

請縮進代碼以便我們更有幫助 –

回答

1

initCause返回Throwable

這意味着你實際上拋出了Throwable而不是ParentException,所以編譯器抱怨說你扔了Throwable但沒有捕獲它。

您可以通過更改ParentExceptionChildException來解決此問題,以便它們不僅收到錯誤消息,還會收到原因。然後,您可以撥打Exception constructor that receives a message and a cause

1

initCause()將拋出的Throwable對象,所以你應該捕獲該異常

catch (Throwable e) 
    {    
     e.printStackTrace(); 
    } 
1

只是因爲initCause返回一個Throwable實例:

public synchronized Throwable initCause(Throwable cause) 

雖然抓子句無法捕獲任何Throwable參考。您可以添加Throwable以及其他例外。

try { 
      throw new ParentException().initCause(new ChildException().initCause(new SQLException())); 
     } catch (ParentException | ChildException | SQLException e) { 
      e.printStackTrace(); 
      try { 
       Thread.sleep(10 * 1000); 
      } catch (Exception et) { 
       ; 
      } 
     } catch (Throwable e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

或只是趕上的Throwable,如果你想趕上所有拋出異常,包括提到的三個例外和所有其他錯誤,異常延伸的Throwable

try { 
      throw new ParentException().initCause(new ChildException().initCause(new SQLException())); 

     } catch (Throwable e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
0

initCause(Throwable cause)函數返回的Throwable對象:public synchronized Throwable initCause(Throwable cause)和所以當你做throw new ParentException().initCause(new ChildException().initCause(new SQLException()));,你基本上在做throw (new ParentException().initCause(new ChildException().initCause(new SQLException()))) ;,所以你在做throw <ThrowableObject>,因此你必須捕獲Throwable的例外。

try { 
    throw new ParentException().initCause(new ChildException().initCause(new SQLException())); 
} catch (Throwable e) { 
    e.printStackTrace(); 
    try { 
     Thread.sleep(10*1000); 
    } catch(Exception ex) {} 

您可以通過多種方式解決這個問題,我覺得2種最好的方式是通過兩種重載兩個ParentExceptionChildException建設者與

public ParentException(Throwable cause) { 
    super("Parent Exception is called", cause); 
} 

和類似版本ChildException和使用

throw new ParentException(new ChildException(new SQLException())); 

而不是initcause(),,通過執行以下操作而不是

try { 
    ParentException p = new ParentException(); 
    p.initCause(new ChildException().initCause(new SQLException())); 
    throw p; 
} catch (ParentException e) { 
    e.printStackTrace(); 
    try{ 
     Thread.sleep(10*1000); 
    } catch(Exception ex) {} 

注意:您只需要ParentException,並沒有其他異常趕上,因爲它是可能的try體內拋出唯一的例外。嘗試捕獲其他異常(不是超類ParentException)會給出錯誤信息,說明您試圖捕獲從未拋出異常。