0

私は最終的なメンバーデータを持っています:

public final Foo foo;

コンストラクターでfooは、次のように初期化されます。

foo = new Foo();

残念ながら、Foo のコンストラクターは例外をスローする可能性があります。

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

しかし、現在、コンパイラは foo が初期化されていない可能性があると不平を言っています。これは、Foo のコンストラクターが例外をスローした場合に当てはまります。しかし、catch の中括弧を入れるfoo = nullと、foo が初期化された可能性があると不平を言います。

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

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

4

3 に答える 3

7
foo = createFoo();

...


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

内部オブジェクトのコンストラクターが失敗した場合、外部オブジェクトの構築を続行することが理にかなっているのかどうかについてはコメントしません...

于 2012-04-09T19:31:36.580 に答える
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");
       }
   }

そしてそれはすべてうまくコンパイルされます。

于 2012-04-09T19:53:08.183 に答える
0
final Foo foo ;
Foo foo_temp = null ;
try {
    foo_temp = new Foo();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    foo = foo_temp ;
}
于 2012-04-09T19:41:31.117 に答える