请考虑以下代码:
class Chicks {
synchronized void yack(long id) {
for(int x = 1; x < 3; x++) {
System.out.print(id + " ");
Thread.yield();
}
}
}
public class ChicksYack implements Runnable {
Chicks c; //.....(1)
public static void main(String[] args) {
new ChicksYack().go();
}
void go() {
c = new Chicks(); //........(2)
new Thread(new ChicksYack()).start();
new Thread(new ChicksYack()).start();
}
public void run() {
c.yack(Thread.currentThread().getId());
}
}
当我运行此代码时,我得到一个Null Pointer Exception,我没有初始化变量c。但是我没有在线初始化....(2)?我无法得到这个概念。线程是否可以在此例外中发挥作用?
答案 0 :(得分:4)
看看这一行:
new Thread(new ChicksYack()).start();
^^^^^^^^^^^^^^^^
新创建的c
对象的属性ChicksYack
永远不会被初始化。在go()
方法中,您只为当前(c
)对象初始化this
。
这就是你在run()
方法中获得NPE的原因。一个好的解决方案是在ChicksYack
的默认构造函数中初始化该变量。
答案 1 :(得分:0)
在go()
方法中,您将实例化两个新的ChickYack
对象,这些对象具有空c
。您应该将c = new Chicks()
放在ChicksYack
构造函数中。