线程中的NullPointerException

时间:2014-10-27 17:38:34

标签: java

为什么我在这里得到NullPointerException

package Threads;

public class Test implements Runnable {

      FF d;

     public static void main(String[] args) {

          new Test().go();

       }

      void go() {

         System.out.println(Thread.currentThread());
         d = new FF();
         new Thread(new Test()).start();
         new Thread(new Test()).start();
      }

      public void run() {

         System.out.println(d);
         System.out.println(Thread.currentThread());
         d.chat(Thread.currentThread().getId());//RTE
     }

}

class FF {

    static long flag = 0;

      void chat(long id) {

           if(flag == 0) {

              flag = id;

           }
           for(int x=1;x<3;x++) {

               if(flag == id) {

                   System.out.println("Yo");

               }else {

                   System.out.println("dude");

                }
           }
     } 
}

//可以解释为什么我在这里得到NullPointerException。尽管d引用变量在go()方法中初始化但我认为在创建新Thread时它有一些事情要做。

2 个答案:

答案 0 :(得分:6)

d是类Test的实例字段。为Test的一个实例初始化它不会为随后创建的所有实例初始化它。您已在go中创建的实例的main方法中初始化了此字段。但之后,您创建了新的实例Test,但其字段尚未初始化:

new Thread(new Test()).start();   // d is not initialized for the new Test() object
new Thread(new Test()).start();

一种解决方案是在构造函数中初始化字段:

public Test() {
    d = new FF();
}

答案 1 :(得分:1)

你正在创建一个新的Test实例,因此d没有被初始化(因为thread.start方法不会调用你的go方法而只调用run方法)。