Задать вопрос
unowhat
@unowhat

Ошибка в синхронизации потоков или в чем-то еще?

При работе выскакивает регулярно NullPointerException.

Вот код:
...
public class FindWordsUsingThreads {

    public static char[] letters = {'c', 'e', 'n', 'r', 'c', 'u', 't', 'm'}; //изначальный набор симоволов
    public static int l = letters.length - 1; //количество символов
    public static String finalText; //конечный результат
    public static char[][] results = new char[l + 1][l]; // массив строк с результатами
    public static boolean[][] flags = new boolean[l + 1][]; //флаги, учитывающие использование букв. true - можно использовать. false - уже использована
    public static int[] position; // номер буквы, которая подбирается в данный момент

...
public static synchronized void work(int number, FileWriter writer){
        // устанавливаем начальную позицию
        position[number] = 0;

        // удаляем из массива букву, которая стоит первой и которую не используем в алгоритме
        char[] currentLetters = new char[l];
        for (int i = 0; i < l; i++) {
            if (i < number) currentLetters[i] = letters[i];
            if (i > number) currentLetters[i] = letters[i + 1];
        }

        //устанавливаем стартовые флаги true
        for (int i = 0; i < l; i++) flags[number][i] = true;

        //поехали по алгоритму
        for (int i = 0; i < l; i++) {
            results[number][position[number]] = currentLetters[i];
            flags[number][i] = false;
            position[number]++;
            getNextLetter(position[number], number, currentLetters);
            position[number]--;
            flags[number][i] = true;
            try{
                writer.write(finalText);
            } catch (IOException ex){

            }
        }
    }
...

class NewThread implements Runnable{
    String name;
    Thread t;
    int number;
    FileWriter writer;

    public NewThread(String threadname, int threadnumber, FileWriter threadwriter){
        name = threadname;
        number = threadnumber;
        writer = threadwriter;
        t = new Thread(this, name);
        System.out.println(name + " стартовал.");
        t.start();
    }

    //входная точка потока
    public void run(){
        FindWordsUsingThreads.work(number, writer);
        System.out.println(this.name + " закончил.");
    }
}


Так вот, почему выскакивает nullpointer? Ошибку выдает на строке
for (int i = 0; i < l; i++) flags[number][i] = true;

метода work.

массив flags инициализирован явно в мэйне.
может быть это связано с тем, что flags занят другим потоком?
если так, то как исправить?
  • Вопрос задан
  • 254 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Вы точно его доинициализируете в мэйне? Потому как на данном эта пе это массив нулов.

public static boolean[][] flags = new boolean[l + 1][];

И доинициализируете массив до старта потоков или после?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы