Программа выводит исключение NullPointerException? Что я не так делаю, объясните пожалуйста

public class Main {
    public static void main(String[] args) {
        SequenceGenerator generator = new SequenceGenerator();
        SequenceObserver sequenceObserver = new SequenceObserver();
        Sequence sequence = generator.generate(6);

        sequence.replaceNumberToSequence(1,78);
        sequence.addNumberToSequence(23);
        sequence.getNumberByIndex(5);
        sequence.insertNumberToSequence(4,36);
        sequence.removeByIndex(3);
        sequence.removeByValue(1);
    }
}

// печатает события, которые происходят в конкретном Sequence
// ДОБАВЛЕН ЭЛЕМЕНТ - значение
public class SequenceObserver {

    public void printRemoveByIndex(int index){
        System.out.println("Удален индекс " + index);
    }

    public void printAddNumber(int number){
        System.out.println("Добавлен число " + number);
    }

    public void printInsertNumber(int index, int number){
        System.out.println("Вставлено число " + number + " в индекс " + index);
    }

    public void printNumberGetByIndex(int index){
        System.out.println("Получено число по индексу " + index);
    }

    public void printReplaceNumber(int index, int number){
        System.out.println("Элемент под индексом " + index + " заменен на число " + number);
    }

    public void printRemoveByValue(int number){
        System.out.println("Удален элемент " + number);
    }
}

import java.util.Random;

// генерирует массив случайных последовательностей
public class SequenceGenerator {
    private Random random;

    public SequenceGenerator() {
        this.random = new Random();
    }

    public Sequence generate(int size){
        int[] generateArray = new int[size];
        for (int i = 0; i < generateArray.length; i++){
            generateArray[i] = random.nextInt(10);
        }
        return new Sequence(generateArray);
    }
}

import java.util.Arrays;

public class Sequence {
    //Создаем поля класса Sequence
    private SequenceObserver sequenceObserver;
    private SequenceResult sequenceResult;
    private int[] generateArray;

    public Sequence(SequenceObserver sequenceObserver) {
        this.sequenceObserver = sequenceObserver;
    }

    public Sequence(int[] generateArray){
        this.generateArray = generateArray;
    }

    // 3, 4, 5 -> removeByValue(5) -> 3, 4
    // удалить число из последовательности по значению
    public void removeByValue(int value) {
        int [] newArray = new int[generateArray.length - 1];
        int count = 0;

        for(int j = 0; j < generateArray.length; j++){
            if(generateArray[j] != value){
                newArray[count++] = generateArray[j];
            }
        }
        Arrays.copyOfRange(newArray,0,count);
        System.out.println("------------------------------");
        sequenceObserver.printRemoveByValue(value);
        sequenceResult.showResultRemoveValue(newArray);
    }

    // 3, 4, 5 -> removeByIndex(1) -> 3, 5
    // удалить число из последовательности по индексу
    public void removeByIndex(int index) {
        int [] newArray = new int[generateArray.length - 1];
        int count = 0;
        for(int j = 0; j < generateArray.length; j++){
            if(j != index){
                newArray[count++] = generateArray[j];
            }
        }
        Arrays.copyOfRange(newArray,0,count);
        System.out.println("------------------------------");
        sequenceObserver.printRemoveByIndex(index);
        sequenceResult.showResultRemoveIndex(newArray);
    }

    // добавить число в последовательность
    public void addNumberToSequence(int number) {
        int [] newArray = new int[generateArray.length + 1];
        for(int i = 0; i < newArray.length - 1; i++){
            newArray[i + 1] = generateArray[i];
        }
        newArray[0] = number;
        System.out.println("------------------------------");
        sequenceObserver.printAddNumber(number);
        sequenceResult.showResultAddNumber(newArray);
    }

    // вставить элемент со сдвигом всех остальных - insert()
    public void insertNumberToSequence(int index, int number) {
        int [] newArray = new int[generateArray.length + 1];
        for(int i = 0; i < newArray.length - 1; i++){
            if(i < index) {
                newArray[i] = generateArray[i];
            } else {
                newArray[i + 1] = generateArray[i];
            }
        }
        newArray[index] = number;
        System.out.println("------------------------------");
        sequenceObserver.printInsertNumber(index, number);
        sequenceResult.showResultInsertNumber(newArray);
    }

    // получить элемент по индексу
    public void getNumberByIndex(int index) {
        int findNumber = -1;
        for(int j = 0; j < generateArray.length; j++){
            if(j == index){
                findNumber = generateArray[j];
                break;
            }
        }
        System.out.println("------------------------------");
        sequenceObserver.printNumberGetByIndex(index);
        sequenceResult.showResultNumberByIndex(findNumber);
    }

    // вставить элемент в индекс - replace()
    public void replaceNumberToSequence(int index, int number) {
        for(int j = 0; j < generateArray.length; j++){
            if(j == index){
                generateArray[j] = number;
                break;
            }
        }
        System.out.println("------------------------------");
        sequenceObserver.printReplaceNumber(index, number);
        sequenceResult.showResultReplaceNumber(generateArray);
    }
}

import java.util.Arrays;

//Выводит результат операции
public class SequenceResult {
    public void showGenerateArray(SequenceGenerator[] array){
        System.out.println(Arrays.toString(array));
    }

    public void showResultAddNumber(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultRemoveValue(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultRemoveIndex(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultInsertNumber(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultNumberByIndex(int findNumber){
        System.out.println(findNumber);
    }

    public void showResultReplaceNumber(int[] generateArray){
        System.out.println(Arrays.toString(generateArray));
    }

}

Ответы (1 шт):

Автор решения: Aziz Umarov

Приинициализируйте sequenceResult

public class Sequence {
    //Создаем поля класса Sequence
    private SequenceObserver sequenceObserver;
    private SequenceResult sequenceResult;
    private int[] generateArray;

    public Sequence(SequenceObserver sequenceObserver) {
        this.sequenceObserver = sequenceObserver;
    }

используете его на право и на лево

   sequenceResult.showResultRemoveValue(newArray);

не инициализировав его

    public class Main {
    public static void main(String[] args) {
        SequenceGenerator generator = new SequenceGenerator();
        SequenceObserver sequenceObserver = new SequenceObserver();
        Sequence sequence = generator.generate(6);

        sequence.replaceNumberToSequence(1,78);
        sequence.addNumberToSequence(23);
        sequence.getNumberByIndex(5);
        sequence.insertNumberToSequence(4,36);
        sequence.removeByIndex(3);
        sequence.removeByValue(1);
    }
}

// печатает события, которые происходят в конкретном Sequence
// ДОБАВЛЕН ЭЛЕМЕНТ - значение
public class SequenceObserver {

    public void printRemoveByIndex(int index){
        System.out.println("Удален индекс " + index);
    }

    public void printAddNumber(int number){
        System.out.println("Добавлен число " + number);
    }

    public void printInsertNumber(int index, int number){
        System.out.println("Вставлено число " + number + " в индекс " + index);
    }

    public void printNumberGetByIndex(int index){
        System.out.println("Получено число по индексу " + index);
    }

    public void printReplaceNumber(int index, int number){
        System.out.println("Элемент под индексом " + index + " заменен на число " + number);
    }

    public void printRemoveByValue(int number){
        System.out.println("Удален элемент " + number);
    }
}

import java.util.Random;

// генерирует массив случайных последовательностей
public class SequenceGenerator {
    private Random random;

    public SequenceGenerator() {
        this.random = new Random();
    }

    public Sequence generate(int size){
        int[] generateArray = new int[size];
        for (int i = 0; i < generateArray.length; i++){
            generateArray[i] = random.nextInt(10);
        }
        return new Sequence(generateArray);
    }
}

import java.util.Arrays;

public class Sequence {
    //Создаем поля класса Sequence
    private SequenceObserver sequenceObserver;
    private SequenceResult sequenceResult;
    private int[] generateArray;

    public Sequence(int[] generateArray, SequenceObserver sequenceObserver){
        this.generateArray = generateArray;
        this.sequenceObserver = new SequenceObserver();
        this.sequenceResult = new SequenceResult();
    }

    // 3, 4, 5 -> removeByValue(5) -> 3, 4
    // удалить число из последовательности по значению
    public void removeByValue(int value) {
        int [] newArray = new int[generateArray.length - 1];
        int count = 0;

        for(int j = 0; j < generateArray.length; j++){
            if(generateArray[j] != value){
                newArray[count++] = generateArray[j];
            }
        }
        Arrays.copyOfRange(newArray,0,count);
        System.out.println("------------------------------");
        sequenceObserver.printRemoveByValue(value);
        sequenceResult.showResultRemoveValue(newArray);
    }

    // 3, 4, 5 -> removeByIndex(1) -> 3, 5
    // удалить число из последовательности по индексу
    public void removeByIndex(int index) {
        int [] newArray = new int[generateArray.length - 1];
        int count = 0;
        for(int j = 0; j < generateArray.length; j++){
            if(j != index){
                newArray[count++] = generateArray[j];
            }
        }
        Arrays.copyOfRange(newArray,0,count);
        System.out.println("------------------------------");
        sequenceObserver.printRemoveByIndex(index);
        sequenceResult.showResultRemoveIndex(newArray);
    }

    // добавить число в последовательность
    public void addNumberToSequence(int number) {
        int [] newArray = new int[generateArray.length + 1];
        for(int i = 0; i < newArray.length - 1; i++){
            newArray[i + 1] = generateArray[i];
        }
        newArray[0] = number;
        System.out.println("------------------------------");
        sequenceObserver.printAddNumber(number);
        sequenceResult.showResultAddNumber(newArray);
    }

    // вставить элемент со сдвигом всех остальных - insert()
    public void insertNumberToSequence(int index, int number) {
        int [] newArray = new int[generateArray.length + 1];
        for(int i = 0; i < newArray.length - 1; i++){
            if(i < index) {
                newArray[i] = generateArray[i];
            } else {
                newArray[i + 1] = generateArray[i];
            }
        }
        newArray[index] = number;
        System.out.println("------------------------------");
        sequenceObserver.printInsertNumber(index, number);
        sequenceResult.showResultInsertNumber(newArray);
    }

    // получить элемент по индексу
    public void getNumberByIndex(int index) {
        int findNumber = -1;
        for(int j = 0; j < generateArray.length; j++){
            if(j == index){
                findNumber = generateArray[j];
                break;
            }
        }
        System.out.println("------------------------------");
        sequenceObserver.printNumberGetByIndex(index);
        sequenceResult.showResultNumberByIndex(findNumber);
    }

    // вставить элемент в индекс - replace()
    public void replaceNumberToSequence(int index, int number) {
        for(int j = 0; j < generateArray.length; j++){
            if(j == index){
                generateArray[j] = number;
                break;
            }
        }
        System.out.println("------------------------------");
        sequenceObserver.printReplaceNumber(index, number);
        sequenceResult.showResultReplaceNumber(generateArray);
    }
}

import java.util.Arrays;

//Выводит результат операции
public class SequenceResult {
    public void showGenerateArray(SequenceGenerator[] array){
        System.out.println(Arrays.toString(array));
    }

    public void showResultAddNumber(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultRemoveValue(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultRemoveIndex(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultInsertNumber(int[] newArray){
        System.out.println(Arrays.toString(newArray));
    }

    public void showResultNumberByIndex(int findNumber){
        System.out.println(findNumber);
    }

    public void showResultReplaceNumber(int[] generateArray){
        System.out.println(Arrays.toString(generateArray));
    }

}

либо сделайте класс SequenceResult статичным со всеми статичными методами

→ Ссылка