2015-04-25 3 views
1

Я работаю над этой программой, и я продолжаю получать исключение NullPointerException, и я не уверен, почему.Исключение null null указателя Java многопоточности

//Constructor 

public LongTask(SharedResults sharedData,int start, int end) 
{ 
    super("Thread"); 
    sharedData=this.sharedData; 
    start = this.start; 
    end=this.end; 

} 

//Run 

public void run() { 
    int sum = 0; 
    for (int num = start; num<=end;num++) 
      { 
     sum+=num; 

     try { 
      Thread.sleep((long)(5000*Math.random())); 
      } 

      catch (InterruptedException e) 
      {} 
     sharedData.addToResult(sum); 
     } 
} 
} 

В итоге я получаю ошибку NullPointerException. Похоже, мои данные не суммируются правильно.

ответ

4

Ваша проблема:

sharedData=this.sharedData; 
start = this.start; 
end=this.end; 

Вы назначены переменный уровень метода, чтобы иметь значение переменного уровня класса. Это должно быть наоборот. Теперь, как это написано, ваши SharedData всегда будут null, потому что они никогда не будут назначены в конструкторе. Поэтому позже, когда вы звоните

sharedData.addToResult(sum); 

Вы вызываете пытаетесь вызвать этот метод нулевой ссылки на объект, который объясняет свой NullPointerException.

+2

Вы должны назначить переменные поля не значениям параметров, вам нужно сделать это наоборот. «this.sharedData = sharedData», если эта часть вас смущает, используйте разные имена переменных в качестве значений параметров. – ObedMarsh

Смежные вопросы