Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
1

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

17.03.2013, 22:16. Просмотров 1777. Ответов 8
Метки нет (Все метки)

пишу код, и в одном месте возникает жёлтенький треугольничек, с предупреждением что "потеря this в конструкторе",,,но при этом всё работает,,,может кто-нибудь знает почему так происходит,,,просто нигде не нашла почему так происходит,,,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 22:16
Ответы с готовыми решениями:

Сеттер в конструкторе
Господа, приветствую. Вопрос к людям с обширной практикой. Со времен, когда...

потеря инкремента
Вот такой вот код: int a = 6; a += 5 + a++; System.out.println(a); На...

Singleton с параметрами в конструкторе
Подскажите, пожалуйста, как можно передать параметры в конструктор используя...

Инициализция поля в конструкторе
В чем разница между создании объекта в конструкторе и непосредственно в поле? ...

Допустимость кода в конструкторе
Так вообще можно делать в конструкторе? Нужно при каждом инстансе печатать на...

8
exiqa
486 / 332 / 71
Регистрация: 24.12.2011
Сообщений: 591
18.03.2013, 11:44 2
можете код показать?
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.03.2013, 13:30 3
вот вам демо возможных проблем
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
import java.util.ArrayList;
import java.util.List;
 
public class LostThis {
    public static void main(String[] args) {
        List<One> l = new ArrayList<One>();
        for (int i = 0; i < 10; i++) {
            One o = new One(l);
            l.add(o);
            o.start();
        }
    }
}
 
class One extends Thread {
    private List<One> t;
 
    public One(List<One> t) {
        this.t = t;
        t.remove(this);
    }
 
    @Override
    public void run() {
        System.out.println(t);
    }
}
это совсем уж тупой пример, а в жизни происходит часто так, что ссылка this уплывает из конструктора наружу ещё до инициализации всех проперти класса и если там зареган какой нибудь обсервер или листенер он тутже начнёт пытаться юзать данные из ссылки и естественно напорется на нуль поинтер или конкурент модифай
1
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
18.03.2013, 17:18  [ТС] 4
это часть, сам код очень большой
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class DopClass {
            int element; 
            DopClass prev;
            DopClass next;
            DopClass head;
            DopClass toll;
    
             DopClass(int element)
                {
                    this.element = element;
                    this.head = this;//именно здесь это и происходит "потеря this"
                    this.toll = this;//именно здесь это и происходит "потеря this"
                    this.head.prev = null;
                    this.toll.next = null;
                }
             void formSpisok(int element)
             {
                 
                 DopClass nElement = new DopClass(element);
                 nElement.prev=this.toll;
                 this.toll.next=nElement;
                 this.toll=nElement;
             }
             void Print(int n)
             {
                 DopClass tmp = this.head;
                 for(int i=0;((i<n)&&(tmp!=null));i++)
                 {
                     System.out.print(tmp.element+" ");
                     tmp=tmp.next;
                 }
             }
             void Print()
             {
                 DopClass tmp = this.head;
                 for(int i=0;(tmp!=null);i++)
                 {
                     System.out.print(tmp.element+" ");
                     tmp=tmp.next;
                 }
                
             }
             void Removall()
             {
                 DopClass tmp = this.head;
                 this.head = null;
             }
             void Remove(int index)
             {
                 if (index<this.Size())
                         {
                 DopClass tmp = this.head;
                 for (int i=0;i<index;i++)
                        { 
                            tmp=tmp.next;
                        }
                 if(tmp.next==null)//последний элемент
                    {
                        this.toll=tmp.prev;
                        tmp.prev.next=null;
                    }
                 if (tmp.prev==null)//первый элемент
                    {
                       this.head=tmp.next;
                       tmp.next.prev=null; 
                    }
                 if((tmp.prev!=null) & (tmp.next!=null))//середина 
                  {
                      tmp.prev.next=tmp.next;
                      tmp.next.prev=tmp.prev;
                  }
                         }
             }
             
           
              int Size()
             {
                DopClass tmp = this.head;
                int kol=0;
               do 
               {
                   tmp=tmp.next;
                   kol++;
                   //System.out.println(kol+" ");
               } while (tmp!=null);
                 return kol;
             }
            
              boolean Cont (int uElement)
              {
                
                  DopClass tmp = this.head;
                  for (int i=0;i<this.Size();i++)
                    {
                        if (tmp.element==uElement)//первый элемент
                            {
                                return true;
                            }
                        else    
                            {
                                tmp=tmp.next;
                            }
                    }
                  return false;
              }
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.03.2013, 17:35 5
Цитата Сообщение от tesler Посмотреть сообщение
это часть, сам код очень большой
Кликните здесь для просмотра всего текста
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class DopClass {
            int element; 
            DopClass prev;
            DopClass next;
            DopClass head;
            DopClass toll;
    
             DopClass(int element)
                {
                    this.element = element;
                    this.head = this;//именно здесь это и происходит "потеря this"
                    this.toll = this;//именно здесь это и происходит "потеря this"
                    this.head.prev = null;
                    this.toll.next = null;
                }
             void formSpisok(int element)
             {
                 
                 DopClass nElement = new DopClass(element);
                 nElement.prev=this.toll;
                 this.toll.next=nElement;
                 this.toll=nElement;
             }
             void Print(int n)
             {
                 DopClass tmp = this.head;
                 for(int i=0;((i<n)&&(tmp!=null));i++)
                 {
                     System.out.print(tmp.element+" ");
                     tmp=tmp.next;
                 }
             }
             void Print()
             {
                 DopClass tmp = this.head;
                 for(int i=0;(tmp!=null);i++)
                 {
                     System.out.print(tmp.element+" ");
                     tmp=tmp.next;
                 }
                
             }
             void Removall()
             {
                 DopClass tmp = this.head;
                 this.head = null;
             }
             void Remove(int index)
             {
                 if (index<this.Size())
                         {
                 DopClass tmp = this.head;
                 for (int i=0;i<index;i++)
                        { 
                            tmp=tmp.next;
                        }
                 if(tmp.next==null)//последний элемент
                    {
                        this.toll=tmp.prev;
                        tmp.prev.next=null;
                    }
                 if (tmp.prev==null)//первый элемент
                    {
                       this.head=tmp.next;
                       tmp.next.prev=null; 
                    }
                 if((tmp.prev!=null) & (tmp.next!=null))//середина 
                  {
                      tmp.prev.next=tmp.next;
                      tmp.next.prev=tmp.prev;
                  }
                         }
             }
             
           
              int Size()
             {
                DopClass tmp = this.head;
                int kol=0;
               do 
               {
                   tmp=tmp.next;
                   kol++;
                   //System.out.println(kol+" ");
               } while (tmp!=null);
                 return kol;
             }
            
              boolean Cont (int uElement)
              {
                
                  DopClass tmp = this.head;
                  for (int i=0;i<this.Size();i++)
                    {
                        if (tmp.element==uElement)//первый элемент
                            {
                                return true;
                            }
                        else    
                            {
                                tmp=tmp.next;
                            }
                    }
                  return false;
              }
это именно тот случай о котором я говорил, представьте себе вариант
когда ваш класс ещё в процессе создания и присваивания ссылок, а на нём уже вызвали метод сайз (например в мультипоточном окружении), в некоторых случаях вы гарантированно получите нульпоинтер в DopClass tmp = this.head;
и вместо реального сайза вам вернётся размер 0
1
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
18.03.2013, 21:48  [ТС] 6
извините, я что-то не совсем понимаю,,,это объявление у меня идет поверх всех "функций", вроде бы не должно такого происходить,,,

Добавлено через 2 минуты
собственно, как с этим бороться,,,? чтобы "культурно" всё было=)))
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
19.03.2013, 01:02 7
Цитата Сообщение от tesler Посмотреть сообщение
собственно, как с этим бороться,,,? чтобы "культурно" всё было=)))
не присваивать переменным ссылку на this до завершения создания класса в конструкторе, есть несколько путей,
1. фабрика
2. приватный конструктор
3. внутренний воспомогательный класс который на себе несёт всю логику работы а внешний является контроллером этой логики
1
tesler
3 / 3 / 3
Регистрация: 08.04.2011
Сообщений: 199
21.03.2013, 15:19  [ТС] 8
как понимать "фабрика"?
0
AckiyBolt
649 / 398 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
21.03.2013, 16:56 9
тыц
1
21.03.2013, 16:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 16:56

Вызов методов в конструкторе
Доброго времени суток, уважаемые форумчане! Почему при создании объекта...

Создание массивов в конструкторе
Вот мой пример, но не пойму что здесь не так... public class Trigers {...

Работа аргументов в методе и конструкторе
Добрый день!Буду благодарен, если кто-нибудь пошагово объяснит, как аргументы в...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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