2010-04-30 3 views
0

Я получаю исключение 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

Какая ошибка? – OscarRyz

+0

Мой код - грубая psuedo-версия моего фактического кода. Точка с запятой не проблема. У меня нет ошибок компиляции. Когда я запускаю приложение, у меня появляется диалоговое окно Android, в котором говорится: «Приложение неожиданно остановилось. Повторите попытку». При дальнейшей отладке получается одно из назначений, которое я делаю, используя метод родительского класса и бросая исключение NullPointerException. Не уверен, почему, хотя конструктор суперкласса неявно называется FIRST в конструкторе подкласса, правильно? – stormin986

+0

Это странно, однако, поскольку раньше, когда я прокомментировал строку, используя метод суперкласса, он все равно разбился. Теперь, когда я просто назначаю постоянные строки внутренним членам класса, все в порядке.Нечетный ... – stormin986

ответ

0

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

public static class Data { 

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

обновление

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

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

MainApplication() { 
    super(); 

    data = new Data(); 
+0

-1 Что случилось с привязкой к экземпляру 'MainApplication', поскольку он создан в конструкторе' MainApplication', экземпляр существует (если Dalvik работает по-другому, что я так не думаю) – OscarRyz

+0

@Oscar, что не так что в конструкторе 'MainApplication' не построено полностью, что означает, что неявная ссылка между экземпляром' Data' и его родительским объектом по-прежнему относится к объекту, который, возможно, несовместим. Как будто вы вызываете свои собственные методы из своего конструктора. – rsp

+0

mmhh это не то, как работает java. Во всяком случае, это не проблема здесь :) Peace – OscarRyz

1

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

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

+1 и значок чтения ума, если это правильный ответ. Поскольку stormin986 не отправляет фактическую ошибку (которая в этом случае была бы: * «Хороший программист, ожидаемый» *), мы не можем знать, был ли это правильный ответ или нет. – OscarRyz

+0

Эти проблемы скорее вызвали бы ошибку compiletime. – BalusC

0

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

+0

Код, который уже опубликован, работает. –

+0

-1 Поскольку он создает экземпляр внутреннего класса 'Data' внутри конструктора внешнего класса, экземпляр уже существует. Этот ответ вводит в заблуждение. – OscarRyz

+0

Экземпляр не считается завершенным до завершения его конструктора. Даже если это можно заставить работать, крайне плохой практикой делать то, что делается здесь. – DJClayworth

Смежные вопросы