0

考虑以下代码:

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

当我运行这段代码时,我得到一个空指针异常,我没有初始化变量 c。但是我不是在 ....(2) 行初始化它吗?我很难理解这个概念。线程是否在这个异常中起作用?

4

2 回答 2

4

看看这一行:

new Thread(new ChicksYack()).start();
           ^^^^^^^^^^^^^^^^

c新创建的ChicksYack对象的属性永远不会被初始化。在该方法中,您只需为当前 ( ) 对象进行go()初始化。cthis

这就是您在该run()方法中获得 NPE 的原因。一个好的解决方案是在默认构造函数中初始化该变量ChicksYack

于 2013-06-29T00:02:15.007 回答
0

在该go()方法中,您正在实例化两个ChickYack具有 null 的新对象c。你应该把它c = new Chicks()放在你的ChicksYack构造函数中。

于 2013-06-29T00:02:35.663 回答