2014-10-27 68 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方法而只是運行方法)。