0
public class Chicks {
    synchronized void yacks(long id)
    {
        for(int x = 1; x<3; x++)
        {
            System.out.println(id + " ");
            Thread.yield();
        }
    }
}
class ChickYacks implements Runnable
{
    Chicks c; // No exception if I declare it as static
    public static void main(String[] args) {
        new ChickYacks().go();
    }
    public void run()
    {
        c.yacks(Thread.currentThread().getId()); //Throws a Nullpointer exceptin
    }
    void go()
    {
        c = new Chicks();
        new Thread(new ChickYacks()).start();
        new Thread(new ChickYacks()).start();
    }
}

为什么它会在run method(). 在我看来一切都很好。当我声明Chicks 'c'为静态但我不明白为什么?

4

1 回答 1

6

您的go方法为 - 的“this”实例分配了一个非空值,ChickYacks但随后创建了 的两个实例ChickYacks,每个实例都有一个空值c

你可以:

  • 而是在构造函数中初始化c,以便每个实例都有一个非空值
  • c在字段初始化器中初始化
  • crun()方法中初始化
  • 为方法c中的实例初始化go
  • 传递thisThread构造函数而不是创建新实例
  • 设为c静态,这样您从哪个实例访问它都无关紧要(或者实际上是否在静态方法中访问它;它将与类型相关联而不是与实例相关联)

这与线程无关,真的。如果你不使用线程,你会得到同样的效果,只是在原始线程而不是新线程中抛出异常:

void go()
{
    c = new Chicks();
    new ChickYacks().run(); // Bang!
    new ChickYacks().run();
}
于 2015-05-08T07:04:54.237 回答