Исключение Java Nullpointerexception и устаревший метод

#java #eclipse #nullpointerexception #parallel-processing

#java #eclipse #исключение nullpointerexception #параллельная обработка

Вопрос:

Я скопировал этот код точно из моей книги по параллельному программированию. Когда я попытался его скомпилировать, я получил исключение nullpointerexception, которое, похоже, происходит в коде: t[i]=newThread(счетчики[i]); который, согласно Eclipse, является устаревшим методом.

Единственной внесенной мной модификацией было добавление try{}catch{} для перехвата nullpointerexceptions, чтобы позволить программе фактически запускаться.

Кто-нибудь точно знает, что происходит не так / как это исправить. Заранее спасибо

код

 import java.util.*;
import java.util.concurrent.*;


public class CountThrees implements Runnable
{
private static final int ARRAY_LENGTH=100000;
private static final int MAX_THREADS=10;
private static final int MAX_RANGE=100;
private static final Random random=new Random();
private static int count=0;
private static Object lock=new Object();
private static int[] array;
private static Thread[] t;

public static void main(String[] args)
{
    array=new int[ARRAY_LENGTH];


//initialize elements in the array
for(int i=0;i<array.length;i  )
{
    array[i]=random.nextInt(MAX_RANGE);
}

//create the threads
CountThrees[] counters=new CountThrees[MAX_THREADS];
int lengthPerThread=ARRAY_LENGTH/MAX_THREADS;

for(int i=0; i<counters.length; i  )
{
    counters[i]=new CountThrees(i*lengthPerThread,lengthPerThread);
}
//run the threads
for(int i=0;i<counters.length; i  )
{

    try
    {
    t[i]=new Thread(counters[i]); //NullPointerException Happens here
    t[i].start();
    }
    catch(NullPointerException d)
    {
        System.out.println("Null Pointer Exception Happened");
    }
}

for(int i=0;i<counters.length;i  )
{
    try
    {
    t[i].join();
    }
    catch(InterruptedException e)
    {}
    catch(NullPointerException f)
    {
        System.out.println("Null Pointer Exception Happened");
    }
}
//print the number of threes
System.out.println("Number of threes: "   count);
}

private int startIndex;
private int elements;
private int myCount=0;


public CountThrees(int start,int elem)
{
    startIndex=start;
    elements=elem;
}

//Overload of run method in the Thread class

public void run()
{

    for(int i=0;i<elements; i  )
    {
        if(array[startIndex i]==3)
        {
            myCount  ;
        }

    }


synchronized(lock)
{
    count =myCount;
}
}
}
  

Комментарии:

1. Никогда не перехватывайте NullPointerExceptions. Их наличие означает, что в коде ошибка и его необходимо исправить.

Ответ №1:

Вы никогда не выделяете массив t . Исключение нулевого указателя, которое вы получаете, связано с тем, что ваш массив t равен null. Вам нужно добавить это прямо в начале вашего основного метода:

 t = new Thread[MAX_THREADS];
  

Комментарии:

1. Или вы могли бы сделать это там, где вы создаете t[] .

2. Правильно. Я просто пытался соответствовать тому, как был представлен код.

3. Вот почему я использую ArrayLists :). Я не лит.

4. Это заставило его работать. Очень неприятно, когда код из учебника не работает. Спасибо.

Ответ №2:

Я просмотрел его, но я думаю, что проблема в том, что вы не выделяете память для t, прежде чем пытаться присвоить данные t. Массивы в Java являются указателями. То, что вы пытаетесь сделать, похоже на это в C:

 static thread* t;
//Need to initialize t here using t = new t[MAX_THREADS]
t[i] = ... 
  

Который вызовет исключение NullPointerException.