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()
中抛出Nullpointer异常。一切看起来都很好。当我宣布Chicks 'c'
为静态但我不理解为什么?
答案 0 :(得分:6)
您的go
方法为{this} ChickYacks
的“此”实例分配了非空值,但随后创建了两个新 ChickYacks
实例,每个对于c
,它将具有空值。
你可以:
c
,以便每个实例都具有非空值c
c
方法run()
c
方法go
this
传递给Thread
构造函数,而不是创建新实例c
静态,以便从哪个实例访问它无关紧要(或者实际上是否以静态方法访问它;它将与类型而不是实例相关联)这与线程无关,真的。如果你没有使用线程,你会得到同样的效果,只是在原始线程中抛出异常而不是新线程:
void go()
{
c = new Chicks();
new ChickYacks().run(); // Bang!
new ChickYacks().run();
}