Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
3-1167831546
olevacho_
2007-01-03 16:39
2007.03.25
синхронизация данных между базами


15-1172483591
SerJaNT
2007-02-26 12:53
2007.03.25
Помогите найти книгу


15-1172918421
wsw
2007-03-03 13:40
2007.03.25
Как вычилсить корень из числа типа int64? sqrt() - не помогает!


1-1169653503
DevilDevil
2007-01-24 18:45
2007.03.25
WordWrap у Chechbox-а


2-1173010622
Roman_S
2007-03-04 15:17
2007.03.25
Как учесть клавишу "BACKSPACE"?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский