2013-06-28 35 views
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)?我很難得到這個概念。在這個例外中,線程是否有一部分可以發揮作用?

+0

哪條線給NPE? –

回答

4

看這句話:

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

屬性新建ChicksYack對象的c永遠不會初始化。在go()方法中,您只能初始化當前(this)對象的c對象。

這就是爲什麼你在run()方法中得到NPE的原因。一個好的解決方案是在ChicksYack的默認構造函數中初始化該變量。

+0

甚至更​​好,只需在聲明處初始化它(因爲它不需要任何外部狀態)。 – SimonC

0

go()方法,你實例化兩個新ChickYack對象,其中有一個空c。您應該將c = new Chicks()放在您的ChicksYack構造函數中。