2011-12-03 58 views
2

在我的課程裏面我有一個私有變量,我的方法使用了一個必須被捕獲的異常。如何強制類的調用者捕獲異常?

如何強制被調用者處理異常,而不是讓我在代碼中執行它?

public class SomeLibImpl extends SomeLib { 

    private Mongo _mongo = new Mongo(); 

} 

在哪裏蒙戈拋出UnknownHostException,我必須處理。

如果這是我不應該做的事情,有更好的方法請告訴我,但我也想知道如何強制類的被調用者處理異常。

我以爲我會做到這一點:

public class SomeLibImpl extends SomeLib throws UnknownHostException { 
    // .. 
} 

但是,這並不編譯。

回答

1

要麼你應該在你的構造函數中初始化mongo,並將throws子句放在構造函數中,否則你應該將它傳遞給構造函數(注入它)。

例如

public class Foo extends Bar { 
    private Mongo mongo; 
    public Foo() throws SomeException { 
    mongo = new Mongo(); 
    } 
    // stuff goes here 
} 

或者你可以注入對象變成你的...

public class Foo extends Bar { 
    private Mongo mongo; 
    public Foo(Mongo mongo) { 
    this.mongo = mongo; 
    } 
    // stuff goes here 
} 

對象的構造(依賴注入)的第二個樣式比在類初始化更好,因爲它可以讓你替代其他對象如果你想對對象執行測試,但不想依靠數據庫來做,那麼你可以注入對象的存根(或模擬)版本並單獨測試你的對象。

此外,你不能強迫你的類的用戶來處理你的代碼拋出的異常。即使你拋出一個檢查過的異常,他們也可以忽略它,或者簡單地聲明它們的方法也會拋出異常,從而將任何代碼傳遞給它們。

1

您將throws關鍵字添加到方法簽名中,而不是類定義。

public class SomeLibImpl extends SomeLib { 
    public void someMethod() throws UnknownHostException { 
    // 
    } 
} 
4

使用throws是你需要做的事情來強制調用者處理異常。你的問題是你把它放在你的類聲明中。方法可以拋出異常,類不能。

2

您需要知道checkedunchecked例外的區別。

使用檢查的異常來強制方法的調用者處理異常。
你強迫他,因爲如果調用代碼不處理它不會編譯異常(不像unchecked異常)

在你的情況聲明throws用你的方法檢查異常將這樣做。

1

您可以在構造函數中初始化該字段,並使構造函數拋出一個檢查的異常。

2

只需添加到您的類

public SomeLibImpl() throws UnknownHostException { 
}