2013-06-28 2 views
0

Рассмотрим следующий код:NullPointer Exception и Темы

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()); 
     } 
} 

Когда я запускаю этот код, я получаю исключение нулевого указателя, что я не инициализирована переменной с. Но я не инициализировал его на линии .... (2)? У меня возникли проблемы с получением этой концепции. В этом исключении есть часть, которая играет роль в этом исключении?

+0

Какая линия дает NPE? –

ответ

4

Посмотрите на этой линии:

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

Атрибут c вновь созданного объекта ChicksYack никогда не инициализируется. В методе go() вы только инициализируете c для текущего объекта (this).

Именно поэтому вы получаете NPE в методе run(). Хорошим решением было бы инициализировать эту переменную в конструкторе по умолчанию для ChicksYack.

+0

Или даже лучше, просто инициализируйте его в точке объявления (поскольку он не требует никакого внешнего состояния). – SimonC

0

В способе go() вы создаете два новых объекта ChickYack, в которых есть нуль c. Вы должны поместить c = new Chicks() в свой конструктор ChicksYack.