0

次のようなメソッドでIterableを実装する内部クラスがあります。

public Iterator iterator() {
    return new Iterator() {
        Foo foo = fooThreadLocal.get();
        int bar = foo._bar;
        void baz() {
            System.out.println("" + bar);
            System.out.println("" + foo);
        }
        public Object next() {
            baz();
            ...
        }
    }
}

ひどく(私にとって)、場合によっては、fooの値はbaz内でnullですが、barの値は0です(フィールドが初期化されるときにnullポインター例外はありません)。また、スタックトレースを出力すると、新しく構築されたFooオブジェクトで値を設定するThreadLocalのsetメソッドが呼び出されるため、そもそもフィールドがnullであるのは奇妙ですが、これは別の問題である可能性があります。 。

ここで何が起こっているのか誰か知っていますか?

4

1 に答える 1

0

OK、私はそれを理解しました(最終的に何時間ものデバッグの後)。別のフィールドが初期化されているときに、baz を呼び出していました。私の目は、スタック トレースを (何度も) スキップしました。うーん...しかし、すべての助けに感謝します。特に、これらのフィールドがまだ初期化されていない場合、私が見ているのは予想される動作であるという観察です。

于 2012-05-19T21:19:02.847 に答える