Ошибка вызова метода суперкласса в конструкторе подкласса - PullRequest
0 голосов
/ 30 апреля 2010

Я получаю исключение NullPointerException, вызывающее метод суперкласса в конструкторе внутреннего класса подкласса ... В чем дело?


В главном классе моего приложения (подклассе Application) у меня есть открытый внутренний класс, который просто содержит 3 открытых строковых объекта. В родительском классе я объявляю объект этого внутреннего класса.

public class MainApplication extends Application {
    public class Data {
        public String x;
        public String y;
        public String z;
    }

    private Data data;

    MainApplication() {
        data = new Data()

        data.x = SuperClassMethod();
    }
}

После создания экземпляра объекта в конструкторе я получаю ошибку во время выполнения, когда пытаюсь присвоить значение во внутреннем классе методом суперкласса.

Есть идеи, что здесь? Разве вы не можете вызывать методы суперкласса в конструкторе подкласса?

** Редактировать ** Исходный вопрос был о внутреннем назначении члена класса в конструкторе внешнего класса. Выяснилось, что проблема заключалась в вызове метода суперкласса в конструкторе класса. Это давало мне исключение нулевого указателя. Таким образом, вопрос изменился.

Ответы [ 3 ]

1 голос
/ 30 апреля 2010

Итак, я добавил точку с запятой, пустой базовый класс и основной.

class Application {
}

public class MainApplication extends Application {
    public class Data {
        public String x;
        public String y;
        public String z;
    }

    private Data data;

    MainApplication() {
        data = new Data();

        data.x = "String";
    }

    public static void main(String[] args) {
        new MainApplication();
    }
}

У меня работает! (хотя у меня нет платформы Android.)

(Была ли точка с запятой ошибкой копирования и вставки? Или это был не оригинальный код?)

0 голосов
/ 30 апреля 2010

Нестатический внутренний класс, такой как класс Data, требует, чтобы экземпляр MainApplication был действительным.Во время конструктора MainApplication не полностью сформирован и поэтому не может быть использован.Как сказал rsp, создание статических данных должно обойти эту проблему.

0 голосов
/ 30 апреля 2010

Попробуйте сделать свой внутренний класс static:

public static class Data {

таким образом, он не привязан к экземпляру MainApplication.

обновление

Из вашего комментария кажется, что вы имеете в виду, что Application часть строящегося объекта не инициализируется правильно при вызове методов для него.

Вызов методов объектов, которые конструируются из их собственного конструктора, может привести к неожиданному поведению, поскольку объекты не будут последовательно инициализированы до завершения конструктора. Тем не менее, возможно, что добавление явного вызова в конструктор super исправит вашу зависимость:

MainApplication() {
    super();

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