Форум программистов, компьютерный форум CyberForum.ru

Java ME (J2ME)

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
aldekotan
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 11
#1

Потеря this в конструкторе - Java ME

26.07.2014, 18:45. Просмотров 1414. Ответов 8
Метки нет (Все метки)

И, снова здравствуйте.
Буду краток, при объявлении переменных и не только, через "this" происходит потеря, очевидно, приводящая к ошибке NullPointerException.
Собственно, NetBeans подсказал в чем может быть проблема, выдав предупреждение на этом отрезке кода:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
public Main() {
        super();
        this.var_3cd = -1;
        Class_494.sub_8f("players");
        Main.var_5b = this; //*Конкретно эта строка

Предупреждение следующего содержания:
Кликните здесь для просмотра всего текста
"Потеря this в конструкторе"

А вопрос вот в чем: Во-первых, можно ли устранить эту потерю? И, Во-вторых, стоит ли вообще её устранять, или же, стоит поискать проблему в чем то другом?

ps Уже посещал гугл, кроме пары аглицких сайтов ничего по своему вопросу не нашел, да и под мой случай решения представленные там не сильно подходят.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
turbanoff
Модератор
3888 / 3623 / 432
Регистрация: 18.05.2010
Сообщений: 9,119
Записей в блоге: 11
Завершенные тесты: 1
27.07.2014, 13:46     Потеря this в конструкторе #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
aldekotan, утечка this - это потенциальная проблема. Может привести к всяким нехорошим вещам в будущем.
Избавиться можно так: присвоить Main.var_5b в методе, который вызывает конструктор.
aldekotan
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 11
27.07.2014, 17:56  [ТС]     Потеря this в конструкторе #3
Не совсем понял способ решения. Подумав некоторое время, в методе Main() сделал вызов void Main2, в котором и провел операции с this. Предупреждений больше нет.
turbanoff
Модератор
3888 / 3623 / 432
Регистрация: 18.05.2010
Сообщений: 9,119
Записей в блоге: 11
Завершенные тесты: 1
27.07.2014, 18:26     Потеря this в конструкторе #4
aldekotan, Проблема при таком решении никуда не делась. Вы просто обманули статический анализатор.

Вы же где-то вызываете конструктор Main, так? Ведь можно добавить эту строчку в код вызывающего метода.
Как-то так:
Java
1
2
Main main = new Main();
Main..var_5b = main;
aldekotan
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 11
28.07.2014, 19:23  [ТС]     Потеря this в конструкторе #5
Цитата Сообщение от turbanoff Посмотреть сообщение
aldekotan, Проблема при таком решении никуда не делась. Вы просто обманули статический анализатор.

Вы же где-то вызываете конструктор Main, так? Ведь можно добавить эту строчку в код вызывающего метода.
Как-то так:
Java
1
2
Main main = new Main();
Main..var_5b = main;
turbanoff, ваши слова подтвердились. Та же ошибка в том же месте.
Вот места кода инициализации, и непосредственно Main во всей красе. Черт его знает, может это чем то поможет
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Main extends MIDlet
{
    public static Main var_5b;
    public static Display var_87;
    ...
    public byte var_3cd;
    ...
    public Main() {
        super();
        this.var_3cd = -1;
        Main.var_5b = this;
        Main.var_87 = Display.getDisplay((MIDlet)Main.var_5b);
        this.var_1a5 = new Class_e5();
        final Class_5eb class_5eb = new Class_5eb(Class_572.var_68[0]);
        this.var_130 = class_5eb;
        Class_4e9.var_731 = class_5eb;
        final Class_25e class_25e = new Class_25e();
        this.var_373 = class_25e;
        Class_4e9.var_681 = class_25e;
        final Class_3a5 class_3a5 = new Class_3a5();
        this.var_302 = class_3a5;
        Class_4e9.var_652 = class_3a5;
        new Class_19b();
        this.var_183 = new Class_30();
        Main.var_87.setCurrent((Displayable)this.var_1a5);
        this.sub_b3(this.var_130, (byte)0);
        this.sub_204();
    }


Добавлено через 23 часа 14 минут
Если мне не изменяет память, метод Main() вызывается первым сам по себе. Собственно как и класс Main. Разве нет?
Чем теперь заменять this, понятия не имею. Пробовал инициализировать другие объекты, но, все без толку.
turbanoff
Модератор
3888 / 3623 / 432
Регистрация: 18.05.2010
Сообщений: 9,119
Записей в блоге: 11
Завершенные тесты: 1
28.07.2014, 19:41     Потеря this в конструкторе #6
Проще всего переделать так, чтобы не нужно было сохранять ссылку в var_5b. Зачем вы её туда сохраняете?
aldekotan
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 11
28.07.2014, 22:23  [ТС]     Потеря this в конструкторе #7
Цитата Сообщение от turbanoff Посмотреть сообщение
Проще всего переделать так, чтобы не нужно было сохранять ссылку в var_5b. Зачем вы её туда сохраняете?
Лично я, не очень представляю зачем. Однако если просто не сохранять её, приложение крашится с ошибкой.

ps
Кликните здесь для просмотра всего текста
Автор самого приложения не я кстати, но, о возможности получения исходного кода, в виду устаревшего устройства графической части самого приложения мне договориться все таки удалось. Но, это долгая история
aldekotan
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 11
30.07.2014, 18:01  [ТС]     Потеря this в конструкторе #8
Взял старые исходники (оригинал, так сказать), не стал исправлять участки кода из-за предупреждений, просто исправил критические ошибки, и, приложение заработало без запинки. Из чего сделал вывод, что NPE вызывался не из-за "потери this".А по какой-то другой причине. Однако, искать эту самую причину, нет ни малейшего желания.
Здесь принято закрывать темы? Или нет? Так или иначе, вопрос исчерпан
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 13:40     Потеря this в конструкторе
Еще ссылки по теме:

Explicit в конструкторе C++
потеря this в конструкторе JavaFX
C++ Исключения в конструкторе
Ошибка в конструкторе Delphi
QTime в конструкторе C++ Qt

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Савва
8 / 8 / 0
Регистрация: 12.04.2012
Сообщений: 334
25.08.2014, 13:40     Потеря this в конструкторе #9
aldekotan, зачем явно объявлять super(). Конструктор сам его объявит...
Yandex
Объявления
25.08.2014, 13:40     Потеря this в конструкторе
Ответ Создать тему
Опции темы

Текущее время: 09:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru