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();
            ...
        }
    }
}

奇怪的是(对我来说),在某些情况下,在 baz 中 foo 的值为 null,但 bar 的值为 0(初始化字段时没有空指针异常)。此外,奇怪的是该字段首先为空,因为如果我打印堆栈跟踪,则会调用 ThreadLocal 的 set 方法,该方法使用新构造的 Foo 对象设置其值,但这可能是一个不同的问题.

有谁知道这里会发生什么?

4

1 回答 1

0

好的,我想通了(终于经过数小时的调试)。当另一个字段正在初始化时,我正在调用 baz 。我的眼睛只是在堆栈跟踪中跳过(很多次)。呃...感谢所有帮助,特别是观察到如果这些字段尚未初始化,我所看到的是预期的行为。

于 2012-05-19T21:19:02.847 回答