Форум программистов, компьютерный форум 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. Просмотров 1477. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2014, 18:45     Потеря this в конструкторе
Посмотрите здесь:

потеря this в конструкторе - JavaFX
Доброго времени суток Имеется 5 файлов кода : import javafx.animation.AnimationTimer; import ...

Потеря this в конструкторе - Java SE
пишу код, и в одном месте возникает жёлтенький треугольничек, с предупреждением что "потеря this в конструкторе",,,но при этом всё...

Ошибка в конструкторе - Delphi
Ну что за ошибка? после вызова конструктора? не могу понять.:-| Плиз, помогите разобраться! unit LearnProp; interface ...

Ошибка в конструкторе - Delphi
TCo = class public SList: TStringList; constructor Create; End; constructor TCo.Create; Begin SList :=...

Двоеточие в конструкторе - C++
class A { public: A(): }; Что означает двоеточие и что туда надо писать?

О конструкторе копирования - C++
Доброго времени суток всем присутствующим. Интересует маленький вопрос. В 15-й строке происходит прямое обращение к полю входного объекта...

Intent в конструкторе - Программирование Android
Как правильно создать Intent в конструкторе создаваемого обьекта. Идея в том, чтобы имя обьекта задавалось, путем вызова активности где...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
turbanoff
Модератор
Эксперт Java
3908 / 3643 / 437
Регистрация: 18.05.2010
Сообщений: 9,174
Записей в блоге: 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
Модератор
Эксперт Java
3908 / 3643 / 437
Регистрация: 18.05.2010
Сообщений: 9,174
Записей в блоге: 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
Модератор
Эксперт Java
3908 / 3643 / 437
Регистрация: 18.05.2010
Сообщений: 9,174
Записей в блоге: 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 в конструкторе
Еще ссылки по теме:

Ошибка в конструкторе - C++
Написал задачу, но она не работает. Условие: Разработать класс Элементарная частица с элементами Название, Группа, Заряд, Масса покоя....

Исключения в конструкторе - C++
Приведите пожалуйста пример, где было бы видно как писать конструктор в классе (инициализация полями класса) используя исключения и нужны...

Explicit в конструкторе - C++
Ключевое слово explicit перед конструктором служит лишь для того чтобы не запутаться и передавать аргумент в конструктор явно? Например: ...

.NET 4.x Ошибка в конструкторе - C#
Программа тамагочи, с временем жизни (таймер) и просьбами, обращение к которым происходит через массив делегатов. Выдает ошибку в...

Шаблон в конструкторе - C++
class A { template <class Type> A(Type Object) { } friend class B; };


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

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

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