2014-10-27 78 views
1

为什么会出现在这里的NullPointerExceptionNullPointerException异常在线程

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()方法intialized但我认为它有话在创建新线程时执行。

+0

什么堆栈跟踪说?你应该阅读它来了解问题所在。如果你无法理解,请发布。 – 2014-10-27 17:39:46

+0

你的想法是正确的。谁初始化'd'? 'go()'方法?这是在创建新线程的两行中调用的吗? – 2014-10-27 17:42:15

回答

6

d是类Test的实例字段。将其初始化为Test的一个实例不会为随后创建的所有实例进行初始化。您已在main中创建的实例的go方法中初始化此字段。但在那之后,你创建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

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