Форум: "Прочее";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
Вниз
Вот так фокус !!! Найти похожие ветки
← →
Юрий Зотов © (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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.046 c