@pogoreli

Почему не удается инициализировать объект, переданный в аргументе функции?

Я сейчас пишу программу на Джаве, использующую рекурсию. Сам длинный код включать в вопрос не буду, но я сделал небольшой пример, показывающий суть проблемы.

Я создал класс с конструктором.
Затем я создал объект класса, но не инициализировал его.
Дальше функция вызывает рекурсивную функцию, которая должна инициализировать этот объект и передает его в аргументе. Самой рекурсии тут нет, потому что на проблему это не влияет.
Рекурсивная функция инициализирует объект. После чего основной объект все так же и остается пустым. Вывод его значения выдает null pointer exception. В чем дело, и как это исправить?

public class Test
{
    private class Node //создаем сам класс
    {
        int value;
        
        public Node(int number) //Конструктор
        {
            value = number;
        }
    }
    
    public Node root; //Создаём объект
    
    public void assign(int value)
    {
        assign(value, root); //Передаем этот объект как аргумент
        System.out.println(root.value); //Null pointer exception
    }
    
   private void assign(int value, Node newNode)
    {
        newNode = new node(value);//Инициализируем
    }
}


Разве root и newNode не должны быть одной и той же ячейкой памяти?

Когда я делаю newNode==root
я получаю true.

PS. Я не из России и с русскоязычной терминологией знаком слабо. I was doing my best to translate my question.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
В Java аргументы передаются по значению. Грубо говоря, при вызове метода assign в его области видимости создаётся переменная newNode, в которую копируется адрес значения поля root. Оператор new выделяет область памяти в куче для объекта класса Node и возвращает его адрес в переменную newNode, перезаписывая в ней старое значение. После завершения метода assign переменная newNode перестаёт существовать вместе с записанным в неё адресом, а поле root так и остаётся со значением null.

P.S. Замечания в другом ответе тоже абсолютно справедливы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Jacen11
ох, кто тебя так учил писать? для начала все названия классов с большой буквы должны быть

private class node //создаем сам класс
нет, ничего ты тут не создаешь, а на самом деле описываешь какую то структуру, объект

public node root; //Создаём объект
нет, ничего ты тут не создаешь, а только объявил переменную

System.out.println(root.value); //Null pointer exception
ну естественно, root не был же создан у текущего объекта. А тут в общем то и в принципе нет кода для его задания

научись дебажить уже и разберись в самой элементарной терминологии, и хорошо бы все цепочку вызовов показать. Пытаешься список сделать? так в интернете же море примеров, разбирай
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы