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
EugeneP2
@EugeneP2
Java Dev
Вы точно его доинициализируете в мэйне? Потому как на данном эта пе это массив нулов.

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

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

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽