Nullpointer异常和线程

时间:2013-06-28 23:58:51

标签: java multithreading nullpointerexception

请考虑以下代码:

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)?我无法得到这个概念。线程是否可以在此例外中发挥作用?

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构造函数中。