Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: CL | DM;

Вниз

Вот так фокус !!!   Найти похожие ветки 

 
Юрий Зотов ©   (2007-02-28 18:23) [0]

Java, Eclipse. Один из классов имеет такой метод:

public void selectionChanged(IAction action, ISelection selection) {
 action.setEnabled(!ReplicationFactory.isCenter);
 ... // На этой строке стоит BreakPoint
}

isCenter - статическое булевское поле класса ReplicationFactory. Запускаю и прихожу на BreakPoint (то есть, предыдущая строка только что выполнилась). Стоя на этом брейке, проверяю значения выражений:

ReplicationFactory.isCenter - показывает false. action.isEnabled() - показывает false. Несмотря на not!

Что за чудеса? Ладно, ввожу локальную переменную:

public void selectionChanged(IAction action, ISelection selection) {
 boolean isCenter = ReplicationFactory.isCenter;
 action.setEnabled(!isCenter);
 ... // На этой строке стоит BreakPoint
}

И все работает. То ли лыжи не едут, то ли еще что, но фокус мне понравился. Из-за этого бага полчаса времени потерял, блин.


 
Ketmar ©   (2007-02-28 18:26) [1]

java...


 
ferr ©   (2007-02-28 18:31) [2]

Скорее Eclipse что-то неправильно делает..


 
Юрий Зотов ©   (2007-02-28 18:35) [3]

> ferr ©   (28.02.07 18:31) [2]

Вряд ли. Я ведь потому туда и полез, что сама программа работала неверно.


 
wicked ©   (2007-02-28 18:37) [4]

хм... а версия компилятора/JDK какая?

и еще крамольный мысль есть - а мож javac считает, что приоритет оператора "!" больше, чем оператора "."?

тогда, если так попробовать?
public void selectionChanged(IAction action, ISelection selection) {
action.setEnabled(!(ReplicationFactory.isCenter));
... // На этой строке стоит BreakPoint
}


 
ferr ©   (2007-02-28 18:38) [5]

> и еще крамольный мысль есть - а мож javac считает, что приоритет
> оператора "!" больше, чем оператора "."?

маразм.


 
ferr ©   (2007-02-28 18:43) [6]

А по существу сказать нечего.. Ошибка может быть даже в 17-ой строке ;-). А Вы не могли бы "обрезать" до компилируемого примера?


 
Рамиль ©   (2007-02-28 18:45) [7]


> wicked ©   (28.02.07 18:37) [4]

Это как? А что тогда должно получится в результате !ReplicationFactory?


 
Ученик чародея ©   (2007-02-28 18:46) [8]

Нда, если Зотов взялся за Java, то Delphi  конец.


 
wicked ©   (2007-02-28 18:51) [9]

> Рамиль ©   (28.02.07 18:45) [7]
"!" - оператор булевского отрицания, его результатом есть bool
соответственно, его аргумент также приводится к булевскому выражению - так принято почти во всех си-образных языках...
поэтому, если ReplicationFactory содержит валидную (а других, примем, в java нету) ссылку на обьект, то !ReplicationFactory вернет false
и наоборот - если ReplicationFactory не содержит ссылок, сиречь есть NULL, то !ReplicationFactory вернет true

по моему так (цы) - на истину не претендую


 
Юрий Зотов ©   (2007-02-28 18:52) [10]

> Ученик чародея ©   (28.02.07 18:46) [8]

Почему? Я и Delphi не забываю. Просто участвую не в одном проекте, а они на разных языках, так что пришлось освоить. Благо, что несложно, да и для кругозора полезно.


 
Ketmar ©   (2007-02-28 18:55) [11]

хм. щаз опять вместо полезть и глянуть приоритеты -- разведём флуд на 20 страниц. %-)


 
Юрий Зотов ©   (2007-02-28 19:16) [12]

> wicked ©   (28.02.07 18:51) [9]

Попробовал вычислить выражение !ReplicationFactory - говорит, что ReplicationFactory невозможно разрешить. Убрал not - то же самое. То есть, класс ReplicationFactory, среде, видите ли, в данном месте кода неизвестен - хотя вполне успешно компилируется и работает.

В общем-то, оно и понятно, почему - среде надо писать "class": ReplicationFactory.class - вычисляется прекрасно. Все ОК.
!ReplicationFactory.class - "оператор ! для этого типа не определен". Тоже ОК.

В другом месте был совершенно аналогичный кусок, но без not:
action.setEnabled(ReplicationFactory.isCenter);
и тоже не работал. Ввел локальную переменную - заработало.

Подозреваю, что эта непонятная байда связана с тем, что поле ReplicationFactory.isCenter - статическое. Но почему и как связана - не понимаю. ИМХО, это все же глюк, такого быть не должно.


 
Суслик ©   (2007-02-28 19:19) [13]


>  ИМХО, это все же глюк, такого быть не должно.

у меня все работает.

как у тебя объявлено isCenter?


 
Суслик ©   (2007-02-28 19:23) [14]

вообще странно - и так и сяк у меня работает.
может все-таки 17ая строка? А?


 
Юрий Зотов ©   (2007-02-28 19:27) [15]

> Суслик ©   (28.02.07 19:19) [13]

Это просто константа, используемая для переключения контекста всей программы разом:

public class ReplicationFactory {
 public static final boolean isCenter = false;
 ...
}


 
Суслик ©   (2007-02-28 19:28) [16]

аналогично.
тогда и правда баг, наверное

а java какая?


 
Юрий Зотов ©   (2007-02-28 19:30) [17]

> Суслик ©   (28.02.07 19:23) [14]

> может все-таки 17ая строка?

Да хоть 117-я. Ты можешь объяснить, почему один и тот же код БЕЗ абсолютно лишней промежуточной локальной переменной - НЕ работает, а с ней - работает?

На что и как она влияет, эта переменная?


 
Юрий Зотов ©   (2007-02-28 19:32) [18]

> Суслик ©   (28.02.07 19:28) [16]

java version "1.5.0_10"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)


 
Суслик ©   (2007-02-28 19:35) [19]

у меня 1.5.0_06
так что сказать сложно.
А вот сейчас 11 забабахию - в смысле обновлю:)


 
Канадец   (2007-02-28 19:42) [20]

>Юрий Зотов ©

public static final boolean isCenter = false;  когда-нибудь менялась? Ну например было так public static final boolean isCenter = true;, а потом поменяли.


 
Юрий Зотов ©   (2007-02-28 19:44) [21]

> Суслик ©   (28.02.07 19:35) [19]

А я боюсь обновлять. Проект на этапе сдачи, последние бантики прикручиваю, а сроки, как обычно, горят. Обновишь - не дай Бог, что-нибудь рухнет, тогда ваще полный капут настанет.

Вот сдам - обновлюсь.


 
Суслик ©   (2007-02-28 19:47) [22]

Блин, Юра, а прав, похоже, иноземец то - если билд не делать, то смена значения true на false не сказывается - только что проверил.


 
Сотрудник деканата   (2007-02-28 19:50) [23]

Надо авторебилд включать. И обновить Эклипс до последней версии. В 3.2 по-моему были проблемы с этим..


 
Суслик ©   (2007-02-28 19:51) [24]

я нетбинсом 4.1 пользуюсь, тут такая же штука.


 
Суслик ©   (2007-02-28 19:51) [25]

я нетбинсом 4.1 пользуюсь, тут такая же штука.


 
Канадец   (2007-02-28 19:52) [26]


> Суслик ©   (28.02.07 19:47) [22]


Компилятор просто подставляет константное значение вместо ссылки на класс. Если в классе константа изменилась, компилятору это побоку. Надо либо всё перекомпилировать, либо использовать статический конструктор:

public static final boolean isCenter;

static
{
   isCenter = false;
}


Хотя всё это к данной проблеме может отношения и не иметь.


 
Сотрудник деканата   (2007-02-28 19:56) [27]

> Суслик ©   (28.02.07 19:35) [19]

А почему не 1.6...?


 
Юрий Зотов ©   (2007-02-28 19:57) [28]

> Канадец   (28.02.07 19:42) [20]

Да, конечно. Эта константа для того и вводилась, чтобы разом переключать режим программы (но не во время ее работы, конечно - потому там и final). То есть, она используется, как некое подобие директивы условной компиляции (если можно так выразиться) и меняется только перед самой компиляцией.

При отладке эту константу не раз туда-сюда переключали (причем, ради перестраховки каждый раз чистились оба workspace - и IDEшный и RCPшный).

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


 
iZEN ©   (2007-02-28 20:00) [29]


> Юрий Зотов ©   (28.02.07 18:23)
> И все работает. То ли лыжи не едут, то ли еще что, но фокус
> мне понравился. Из-за этого бага полчаса времени потерял,
>  блин.

Я же предупреждал, что пошаговая отладка в многопоточном приложении НЕ_РАБОТАЕТ.
Используйте JUnit.


 
Канадец   (2007-02-28 20:02) [30]


> Юрий Зотов ©   (28.02.07 19:57) [28]


С отладчиком понятно почему. Отладчик "берёт" её прямо из класса, а там значение уже новое. Что касается промежуточной переменной... по логике вещей туда тоже должна подставлятся константа и смысл меняться не должен, а на самом деле кто его знает... Попробуйте со статическим конструктором. Если работает то проблема именно в этом.


 
Суслик ©   (2007-02-28 20:03) [31]


> [27] Сотрудник деканата   (28.02.07 19:56)
> > Суслик ©   (28.02.07 19:35) [19]
>
> А почему не 1.6...?

да я так - чисто для себя, иногда пописываю дабы иметь возможность сравнивать синтаксис c#, дельфи и java.

поэтому и 1.5 хватит


 
Суслик ©   (2007-02-28 20:03) [32]


> [27] Сотрудник деканата   (28.02.07 19:56)
> > Суслик ©   (28.02.07 19:35) [19]
>
> А почему не 1.6...?

да я так - чисто для себя, иногда пописываю дабы иметь возможность сравнивать синтаксис c#, дельфи и java.

поэтому и 1.5 хватит


 
Ketmar ©   (2007-02-28 20:03) [33]

> iZEN ©   (28.02.07 20:00) [29]
> Я же предупреждал, что пошаговая отладка в многопоточном
> приложении НЕ_РАБОТАЕТ.

чудесная, чудесная штука эта ваша жаба...


 
iZEN ©   (2007-02-28 20:08) [34]


> Юрий Зотов ©   (28.02.07 19:57) [28]
> Но ведь значение константы отладчик показывает абсолютно
> правильно. Почему же, пока тупо не введешь ее промежуточное
> запоминание, имеем глюк?

javac все public static final инлайнит в байткод, который обращается к этим константам. (Кстати, такой же эффект наблюдается со строками, которые объявляют в интерфейсах -- в классах, реализующих такие инетрфейсы, строки вставляются в сам байткод класса. Так что объявление констант в интерфейсах -- ТАБУ).


 
Ketmar ©   (2007-02-28 20:10) [35]

ага. сеперлогичный и защищённый язык. класс.


 
Ученик чародея ©   (2007-02-28 20:11) [36]


> Ketmar ©   (28.02.07 20:03) [33]
>
> > iZEN ©   (28.02.07 20:00) [29]
> > Я же предупреждал, что пошаговая отладка в многопоточном
> > приложении НЕ_РАБОТАЕТ.
> чудесная, чудесная штука эта ваша жаба...


Она работает, только с глюками в режиме отладки. Истинный программист должен писать код без единой ошибки и сразу.


 
iZEN ©   (2007-02-28 20:12) [37]

Вообще же, лучше посмотреть, что собой представляет .class-файл на самом деле (с помощью декомпилятора javap).

P.S.
Зачем пинать труп Java 5.0? Пора переходить на Java 6.0.


 
iZEN ©   (2007-02-28 20:13) [38]


> Ketmar ©   (28.02.07 20:03) [33]
> чудесная, чудесная штука эта ваша жаба...

Нужно быть готовым ко всему! :))


 
Anatoly Podgoretsky ©   (2007-02-28 20:14) [39]

> iZEN  (28.02.2007 20:12:37)  [37]

Переходить или пинать Java 6.0.


 
Суслик ©   (2007-02-28 20:15) [40]

пора переходить на дельфи2007!



Страницы: 1 2 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.032 c
2-1172739333
iviom
2007-03-01 11:55
2007.03.25
DBComboBox


15-1172460498
Slider007
2007-02-26 06:28
2007.03.25
С днем рождения ! 26 февраля


3-1167309164
evgen1
2006-12-28 15:32
2007.03.25
frReport1.Pages.Count=0?


2-1173082254
Нуб
2007-03-05 11:10
2007.03.25
matrix


2-1172855293
pasha star
2007-03-02 20:08
2007.03.25
Мигание как в mIRC