java, объявление HashMap в классе (решено)

💡 Усі статті, обговорення, новини про Java — в одному місці. Приєднуйтесь до Java спільноти!

Решаю тестовую задачку по java. В задачке нужно создать класс NameSurferDataBase для считывания файла в базу и выдачи инфы по конкретному юзеру. С чтением файла проблем не возникает, файл содержит строки вида
Вася 10 20 30 40
Петя 50 40 50 40
Было решено выделять имя юзера и грузить в HashMap две строки — имя (как ключ) и остальную чать строки (как value).
HashMap объявляется за пределами всех методов
private HashMap contents;
и инициализируется в main и там же загружается с файла.
contents = new HashMap();
для выдачи инфы по конкретному юзеру написан другой метод который валит всю программу при вызове проверки существования ключа
private String FindmeName(String name) {
boolean CheckName = contents.containsKey(name);
....
}

строка contents.containsKey(name) в FindmeName валит всю программу.
Если же инициализировать HashMap за пределами всех методов — то все работает. тоесть вместо
private HashMap contents;
написать
private HashMap contents= new HashMap();
и в main сразу грузить в нее данные — то все работает.
помогите понять почему HashMap нада инициализировать за пределами main ???? Уже час ищу — ничего не помогает.

ЗЫ: всем спасибо, ошибка найдена. Один человек даже смог указать номер страницы в книге где как раз описывается такая проблема. Спасибо.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дружище, если тебя не затруднит, залей куда-нибудь свой код и кинь ссылку.
А также текст тестового задания.

С каким эксепшеном вылетает приложение при инициализации хэшмапы в методе main?

а как это узнать, я с джавой только неделю

Неделя и уже тестовое задание?
Какую среду ты используешь для разработки?
Или просто блокнот+командная строка?

Eclipse — фтопку!
Привыкай к нормальной среде разработки — переходи на IDEA.

я раньше в нотепад++ все писал, но как то пару раз пытался перейти на что то хороше и даже пару раз ставил идею — занудная она. Экслипс более менее нормально.

При первом прочтении не понял, что значит «инициализировать в main» (как-то подумалось — в конструкторе). Но теперь дошло.

Так вот, main — это static метод. Со всеми вытекающими.

Здесь на 145 странице можно почитать о статических переменных и методах.

похоже это оно и есть, мейн — это статик метод. Я решил проблему еще вчера убрав main и поставив конструктор, но перед этим перерыл кучу интернета почему маин не хочет правильно инициализировать хештаг. Вы тыкнули как раз в нужное место. Спасибо.

вы бы еще неучились пользоватся gist.github.com для постанья кусков кода..

Статик — это та которая хранит значение одно на весь класс ? тут явно не статик, каждый объект может хранить свою базу, но доступ к перемнной должны иметь все методы. Поэтому и определяется за пределами всех методов. Но если инициализировать внутри мейна то другие методы типа ее не видят.
. Не могу найти нигде описания какая разница где инициализированить переменную — в мейне, в каком то другом методе или за пределами всех методов. Тоесть какая разница в каком месте я говорю

= new HashMap<string,string>();
.

без обид, но вы давно учите яву?
из вашего кода вообще ничего не понятно, но

main
у вас
public static void main(String[] args)
а все остальные методы/поля у вас не статик.
//или же вы недосказали кой чего

ну так вот что бы из «статика» получить доступ к «нестатикам» вам нужен объект (так же известный как «экземпляр класса» )

Тоесть в мэйне — создайте объект и юзайте его методы.
//а вообще в ява мире такой подход годен лишь для самого примитивного, типа лабы в средней школе
public class MyClass{
private HashMap< String, String > readBasicTutorials;
public MyClass(){
this.readBasicTutorials = new ....
}
public void method1(){
this.readBasicTutorials // available, do something
}
public void method1(){
this.readBasicTutorials // available, do something
}
public static void main(String[] args) {
MyClass my = new MyClass();
my.method1();
my.method2();
//and so long
}

}

упс, местная форма комментов сама правит код

private HashMap<string, string=""> readBasicTutorials;
оба стринга с Заглавной и ="" — убрать

О! пробелы спасли от позора)))

3тий день пишу на ява, вроде уже разобрался (выше порекомендовали книгу). Я как раз и создавал объект в мейн и другие методы вызванные из мейна нормально работали, но когда я пытался получить доступ к уже созданному объекту из друго метода — то другой метод похоже ничего о объекте не знал.

1. Очень хоршо почитайте об ООП наткнетесь на «шаблоны/паттерны» — пропустите, рано.
Но что такое инкапсуляция и наследование — нужно знать обязательно (полиморфизм и абстракцию можете оставить на потом)
2. статик: о том что бывают поля/методы принадлежащие (доступные из) класса и экземпляра класса знать нужно обязательно.
3. Но модификаторы видимости public, protected, (package protected) private
4. Документация по JDK очень полезна!
5. Поставьте себе стандартную eclipse (это среда разработки, экономит уйму времени)

5. Поставьте себе стандартную eclipse (это среда разработки, экономит уйму времени)
По сравнению с блокнотом — да.
По сравнению с нормальной IDE — нет.

Разница такая же как между Таврией и автомобилем.

ум..
претензии к эклипсу?

начнем флейм?

не вижу повода,
поскольку не бывает флеймов Таврия (Eclipse) vs BMW (IDEA).
Разумеется водители себя утешают и называют ее «ласточкой», но.......

спасибо, я как раз пользую эклипс.

Думаю у тебя где то бага. Но считаю неэтично тебе помогать, это ж твое тестовое задание, а г-кодеры не могущие написать элементарный код должны мыть туалеты.

ясно что бага, вопрос именно нафига создавать хешмап за пределами main и почему нельзя создавать внути main ? я ж объявляю его как глобальную переменную, какого хрена он теряется в другом методе этого же класса ??

Никаких ограничений непосредственно в джаве нету, бага у тебя в логике и кривизне рук. Ищи.

Підписатись на коментарі