Java Ошибка мутации узла массива узла - нулевой указатель - PullRequest
1 голос
/ 18 марта 2020

Я знаю, что это очень простой вопрос / ответ. Однако я просто хотел быть уверен в правильном ответе. Почему я не могу изменить узел с помощью этого метода addNode? мой код:

public class NODETEST {
public static void main(String[] args) {
    Table myTable = new Table(13);

    String word = "myWord";
    int index = 0;

    myTable.addNode(word, index);
    System.out.println(myTable.array[index].item);
    }
}// end NodeTest
class Table {
    Node[] array;
    public Table(int size) 
    {
        array = new Node[size];
        for(Node x: array)
        {
            x = null;
        }
    }
    public void addNode(String word, int index) {
        Node curr = this.array[index];
        if(curr == null)
        {
            curr = new Node(word, null);
        }
    }
}// table class
class Node {
    String item;
    Node next;
    public Node (String item, Node next)
    {
        this.item = item;
        this.next = next;
    }
}// Node class

output ->

Exception in thread "main" java.lang.NullPointerException
at NODETEST.main(NODETEST.java:10)

, если я изменю эту строку внутри метода addNode =>

curr = new Node(word, null);

с этой строкой =>

this.array[index] = new Node(word, null);

Работает.

Я знаю, что-то с этой переменной curr. Это должно быть что-то, связанное с ссылкой. Что именно здесь происходит?

Если я не могу использовать переменную curr, как я могу добавить 3-й или 4-й узел в тот же массив [index]; как связанный список. Потому что, если мне нужно использовать «this.array [index]» для прямого доступа, как я могу получить доступ / изменить 9-й или 10-й узел в этом точном массиве [index]?

Может быть, это основы c, однако, помощь будет признательна.

1 Ответ

2 голосов
/ 18 марта 2020

Это потому, что java ведет себя так. Я разбью шаг за шагом ниже

Node curr = this.array[index];

Приведенный выше код указывает переменной curr указать адрес памяти this.array[index];. Таким образом, значение cur будет зависеть исключительно от значения this.array[index];. Поэтому любые изменения, которые вы делаете в this.array[index];, отражаются в curr.

curr = new Node(word, null);

Однако приведенный выше код устанавливает curr для указания другого адреса памяти, который является адресом памяти new Node(word, null);. Таким образом, из этого кода больше нет взаимосвязи относительно curr и this.array[index];, поэтому то, что вы делаете с curr, не повлияет на значение this.array[index]; и наоборот.

Если я смогу не использовать переменную curr, как я могу добавить 3-й или 4-й узел к тому же массиву [index]; как связанный список. Потому что, если мне нужно использовать «this.array [index]» для прямого доступа, как я могу получить доступ / изменить 9-й или 10-й узел в этом точном массиве [index]?

У вас есть только чтобы изменить вашу addNode функцию к этому. Обратите внимание, что это просто добавляет узел к последнему узлу этого индекса.

public void addNode(String word, int index) {
    this.array[index];
    if(this.array[index] == null)
    {
        this.array[index] = new Node(word, null);
    } else {
        Node curr = this.array[index]
        // loop so that you can have the address of the last node
        // then stop once the .next is null since this means that it is the last node
        while(curr.next != null){
            curr = curr.next;
        }
        curr.next = new Node(word, null); // set the node
    }
}

ПРИМЕЧАНИЕ: Если вы хотите добавить узел между узлами в этом индексе, то у вас будет отредактировать мой код выше. Я не собираюсь кормить вас ложкой, поэтому попробуйте реализовать это самостоятельно и напишите другой вопрос в SO, если у вас возникнут проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...