Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > HashMap - не понятное поведение


Автор: inohodec 18.8.2008, 19:06
Абалдеть ... (с)

Ребята, объясните мне пожалуйста одну загадку smile
Сейчас столкнулся и у меня ушел час на то что бы понять в чем проблема, а ПОЧЕМУ это происходит ...

И так есть 

Код

private HashMap <Integer, String> reasonCodes = new HashMap <Integer, String> ();

public void setReasonCodes(int lineNumber, String reasonCodes) {
    this.reasonCodes.put(lineNumber, reasonCodes);
}


Сначала для затравки - как вы думаете this.reasonCodes это кто smile ? 
Ну и сам вопрос ПОЧЕМУ ?



Автор: Ortega 18.8.2008, 19:53
Осмелюсь предположить, что это - мап. 
Если компилятор (вдруг) считает, что это не так - можно попробовать переименовать параметр. 
В подобных случаях чаще всего - ошибка в программисте, а не в странной Яве (сам сколько раз попадался). 
А вообще, подобные совпадения имен - моветон. Были бы они хотя бы одного класса....

Автор: Platon 18.8.2008, 19:56
this.reasonCodes - это HashMap, почему? 
потому что ссылка this указывает на то, что reasonCodes не локальная переменная, а переменная объекта

Автор: inohodec 18.8.2008, 20:04
В том то и беда smile

this.reasonCodes - String !!!

И почему это так я понять не могу smile

ПС
Я и не грешу на Java, скорее всего нехватка знаний с моей стороны smile

Автор: Ortega 18.8.2008, 20:13
Это невозможно, потому что это невозможно. Переименуйте параметр и/или поле - и скорее всего, все станет ясно.

Автор: inohodec 18.8.2008, 20:25
Я именно так и сделал, переименовал и все заработало
Но вопрос остался smile

Как такое невозможное возможно

Автор: Platon 18.8.2008, 20:33
Лично у меня всё работает: ни IDE, ни javac ничего не говорят. скопировал/вставил приведенный кусок.

Автор: inohodec 18.8.2008, 20:38
... Все спасибо, вот что значит много работать :(

Просто в дебагере - this.reasonCodes из this.reasonCodes.put(lineNumber, reasonCodes);
Виден как стринг, а я ожидал что будет показыватся как HashMap
Т.е. даже после 10 вставок, в дебагере я ничего не вижу ... просто стринг с новым значением
Хотя после вызова get функции,возвращает правильное значение (HashMap)

smile

Спасибо

Автор: Platon 18.8.2008, 20:39
А можно полностью класс, в котором ты работаешь?

Автор: Ortega 18.8.2008, 20:53
Кажись, я понял. inohodec, ты останавливался в дебаггере, смотрел в разделе variables и видел там String. Я угадал?

P.S. Кроме того, что такие совпадения моветон, они еще и на психику разрушающе действуют ;)

Автор: niasilil 19.8.2008, 03:59
Цитата(Ortega @ 18.8.2008,  20:13)
Это невозможно, потому что это невозможно. 

+1 
не верю. Давай кусок кода, номер jvm, на какой платформе... Хотя такого не бывает, хоть как называй, хоть уписайся и сделай кучу вложенных классов и назови все одинаково, компилятору пофиг как интерпретировать, у него своя четкая логика. И по этой логике такого быть не может. 
Убедите меня если я не прав. 

Автор: inohodec 19.8.2008, 07:28
Со всеми согласен, и именно по тому что сам так думаю и возникли траблы
Т.е. все мои знания говорят что это не возможно, а глаза видят другое

Я вчера был сильно уставший smile и поэтому не совсем верно описал проблему
В дебагере, я вижу что это HashMap, тут он ведет себя вполне разумно
Но, когда я делаю Inspect (Eclipse) что бы посмотреть что внутри
Мне показывается только String, с последним значением
И на этом этапе нет никакой возможности узнать что уже внутри ...

А самое смешное smile
После перезагрузки компа(и сна), все работает замечательно, т.е. так как нужно smile

Наверное я что то начудил с именами, а потом по какой то причине Eclipse то ли не почистил кэш то ли ХЗ 
Или просто 23 часа за компом это слишком smile

Всем спасибо smile

Автор: niasilil 20.8.2008, 02:58
В эклипсе периодически баги вылезают, не заморачивайся. Их ловить очень сложно, потому что воспроизвести практически невозможно. Так и живем. 

Автор: sergioK 28.8.2008, 16:15
Цитата(inohodec @ 19.8.2008,  07:28)
Со всеми согласен, и именно по тому что сам так думаю и возникли траблы
Т.е. все мои знания говорят что это не возможно, а глаза видят другое

Я вчера был сильно уставший smile и поэтому не совсем верно описал проблему
В дебагере, я вижу что это HashMap, тут он ведет себя вполне разумно
Но, когда я делаю Inspect (Eclipse) что бы посмотреть что внутри
Мне показывается только String, с последним значением
И на этом этапе нет никакой возможности узнать что уже внутри ...

А самое смешное smile
После перезагрузки компа(и сна), все работает замечательно, т.е. так как нужно smile

Наверное я что то начудил с именами, а потом по какой то причине Eclipse то ли не почистил кэш то ли ХЗ 
Или просто 23 часа за компом это слишком smile

Всем спасибо smile

Иноходец ,
отдыхать чаще надо  smile 
потом как у string может быть метод put?  

Когда видишь такую лажу пользуй System.out.println  а еще лучше пиши в отдельный  файл ,
 дебагер  - не панацея от всех болезней , 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)