2012-04-09 4 views
0

例外をスローしたときに、最終的な変数が初期化されていることを確認して残念ながら、Fooのコンストラクタは例外をスローする可能性があります:は、コンストラクタは、私が最終メンバーデータを持っている

try { 
    foo = new Foo(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

今のところコンパイラfooが初期化されないかもしれないmplains .Fooのコンストラクタが例外をスローする場合はtrueです。しかし、私がfoo = nullをキャッチブレースの内側に置くと、fooが初期化されている可能性があるという文句があります。

Fooは私が変更できないサードパーティのライブラリです。

これを処理する最も優雅な方法は何ですか?

+0

try/catchブロックがなくても、コンパイラからの苦情はありません。クラスのコンストラクタをFooによって生成された例外をスローするようにしましたか? –

答えて

7
foo = createFoo(); 

... 


private static Foo createFoo() { 
    try { 
     return new Foo(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

は私が

+0

Hah。それを考えなかった。ありがとう! – garbagecollector

0
final Foo foo ; 
Foo foo_temp = null ; 
try { 
    foo_temp = new Foo(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    foo = foo_temp ; 
} 
+0

例外の場合、foo_tempはここで初期化されていませんか? –

+0

@TonyEnnis私はあなたが正しいと思います。 – emory

+0

ねえ、あなたのコードを読むのに少なくとも誰かが世話しました;-) –

0

たぶん私は理解していない...それは内部オブジェクトのコンストラクターが失敗した場合、あなたの外側のオブジェクトの構築を継続することは理にかなっているかどうかについてはコメントをしないが、私エラーを取得しないでください。 ConTestのコンストラクタは、Fooが呼び出す例外をスローすることに注意してください。これは私にとって、あなたの質問に答えるのに最もエレガントです.Fooが初期化に失敗した場合、何かひどく間違っていませんか?

ConTest.java:

public class ConTest { 
     public final Foo foo; 
     public ConTest() throws Exception { 
      foo = new Foo(3); 
     } 
    } 

Foo.java:

public class Foo { 
     public Foo(int i) throws Exception { 
      if (i < 0) throw new Exception("yah"); 
     } 
    } 

と、それはすべての罰金コンパイルします。

+0

ConTestのコンストラクタが例外をスローした場合、はい、何かがひどく 'foo'で間違っています。 ConTestがその例外を再現しなければならないということではありません。 'foo'の初期化に失敗しても、ConTestは機能するはずです。 – garbagecollector

+0

それは私にとって非常に奇妙です。あなたのコードに_if(foo!= null ...)_がたくさんあるでしょうか? –

+0

多くはありませんが、私はソースコード全体を担当していないので、既存の契約に従わなければなりません。 – garbagecollector

関連する問題