2011-12-03 15 views
2

私のクラスの中には、私のメソッドが使用するプライベート変数がありますが、例外はキャッチしなければなりません。クラスの呼び出し元に例外をキャッチさせるにはどうすればいいですか?

どのようにして、被呼び出し者に例外を処理させ、自分のコードで実行させないようにすることができますか?

public class SomeLibImpl extends SomeLib { 

    private Mongo _mongo = new Mongo(); 

} 

ここで、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の違いを知る必要があります。

例外の処理を呼び出し元に強制するには、チェック例外を使用します。
呼び出し元のコードが例外を処理しない場合、それはあなたの方法で確認済み例外でthrowsを宣言するあなたのケースでは(未チェック例外とは違って)

をコンパイルされませんので、あなたは彼を強制しているがそれを行います。

1

コンストラクタでフィールドを初期化し、コンストラクタでチェック例外をスローすることができます。

2

ちょうどあなたのクラスにこれを追加し

public SomeLibImpl() throws UnknownHostException { 
} 
関連する問題