Страница 1 из 2
В чем ошибка? (non-static method cannot be referenced...)
Добавлено: 12 янв 2013, 01:52
djdance
Не понимаю. Вот
сервис1 и вот
класс1. Пытаюсь в классе1 взять getApplicationContext.
Во-первых, его там нет (как быть?). Ладно, делаю паблик запрос через сервис1.
И компилер ругается
java: non-static method getContext() cannot be referenced from a static context
что я делаю не так?
вот код обоих:
Код: Выделить всё
public class сервис1 extends Service {
...
public Context getContext() {
return getApplicationContext();
}
--------------------------------
public class класс1 {
...
void работа(){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(сервис1.getContext());
а если сделать getContext() статиком, то ругается
java: non-static method getApplicationContext() cannot be referenced from a static context
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 03:48
Finch
Типичная ошибка начинающего =) Подсказыть не стану ты сам должен понять =)
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 14:26
djdance
а зачэм тогда форум? я не смог, не просто же так пришёл
public функцию из класса -> в активити вызывал.
а тут не получается
это какие-то ограничения на направления? о_0
опять же делаю иногда скажем переменную паблик - а снаружи её не видно, или видно, но нулл.
че за такое. Паблик не паблик? Как перекидывать переменные - через преференции неудобно.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 15:29
rezak90
он имеет в виду (и я с ним согласен) в том что вам нужно начать с основ java если задаетесь такими вопросами (особенно "делаю иногда скажем переменную паблик - а снаружи её не видно, или видно, но нулл.").
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 16:16
Finch
djdance писал(а):а зачэм тогда форум? я не смог, не просто же так пришёл
public функцию из класса -> в активити вызывал.
а тут не получается
это какие-то ограничения на направления? о_0
опять же делаю иногда скажем переменную паблик - а снаружи её не видно, или видно, но нулл.
че за такое. Паблик не паблик? Как перекидывать переменные - через преференции неудобно.
Обращаться к полям на прямую - правило дурного тона. Существует
инкапсуляция.
У тебя есть класс, в нём есть поля, обращаться к ним нужно через геттеры и сеттеры
Код: Выделить всё
public class User {
private String mName = "Вася Пупкин";
private String[] mNames;
//Тут не будет NullPointerException
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
//А тут будет NullPointerException, знаешь почему? Уверен что у тебя такие же ошибки, когда твои паблик переменные возвращают null
public String[] getNames() {
return mNames;
}
}
П.С. а форум затем чтоб не учить основам языка, а помогать решить какие-то задачи или подводные камни

Тебе нужно выучить основы Java и тогда твои ошибки пропадут сами собой =)
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 16:28
neoksi
Солидарен с коллегами по цеху, просто дать ответ тут нельзя. Нужно, чтоб вы сами понимали, чем статичные данные отличаются от динамических. Могу дать одну подсказку, почитайте о singleton в java.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 16:33
Finch
И больше того, я тебе дам
ссыль на русскоязычную статью с хорошим объяснением + и - разных реализаций паттерна singleton =)
П.С. разве это не чудо иметь такой форум в своей обойме? =)
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 16:49
djdance
старенький я уже, чтобы с основ седьмой синтаксис изучать... и это не от лени.
спасибо neoksi, я примерно понимаю про один экземпляр класса и причину появления null. Примерно вижу, как это заворачивают, да. Мне надо понять, всегда ли так работать, или классы все-таки могут шарить переменные по-простому.
спасибо Finch, я знаю про инкапсуляцию, и даже сделал ее (в нулевом посте она же?) - getContext().
И моё непонимание как раз в том, что компилер ругается на нон-паблик независимо от оформления функции.
Смотрите, поменял в сервисе1 ответ функции на нулл:
public Context getContext() {
return null;//getApplicationContext();
}
При этом в классе1 вызов остался такой:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(сервис1.getContext());
Компилер все равно говорит:
java: non-static method getContext() cannot be referenced from a static context
То есть я бы понял, если бы сервис1 вызывал класс1 и пытался из класса1 взять паблик.
Но у меня же наоборот. Используемый класс1 пытается забрать данные из сервиса1 (родительского).
Что же мне, и родителя обёртывать в инстанс? Непонятно.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 17:18
Finch
Лады ленивец, держи намёк на понимание
Код: Выделить всё
private static Context mContext;
public сервис1() {
mContext = getApplicationContext();
}
public static Context getContext(){
return mContext;
}
ток скажи можно ли так делать?)
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 17:49
djdance
Finch,
да, я тоже к этому пришел. Или делать сеттер в классе1. Работает, спасибо. Не знаю, почему нельзя так делать.
Но - зачем нужно определение ПЕРЕМЕННОЙ областью видимости "паблик", если она не видна и вообще "дурной тон"?
Вот в статьях по синглетону есть пример оборачивания на дельфи. Смешно, но там такой метод излишен - если переменная типа паблик, она ВСЕГДА видна. Да, тоже в общем дурной тон её дергать напрямую. Но ситуация более однозначна, чем в джаве. Зачем же тут нужен "паблик" для переменных?
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 19:20
djdance
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 23:05
KamiSempai
djdance, Вы не понимаете разницы между объектом и классом объекта. Задумайтесь над этим.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 12 янв 2013, 23:34
djdance
KamiSempai
класс - абстракция, объект - созданная из неё работающая структура.
это не даёт мне ответа на вопрос, ЗАЧЕМ нужен паблик для переменных, если их все равно нельзя брать.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 13 янв 2013, 11:21
KamiSempai
djdance писал(а):класс - абстракция, объект - созданная из неё работающая структура.
это не даёт мне ответа на вопрос, ЗАЧЕМ нужен паблик для переменных, если их все равно нельзя брать.
Это делает код менее безопасным. Объект теряет контроль над своими переменными, в любой части кода ни могут быть изменены, даже за пределами этого объекта. Создание гетеров и сетеров помогает обработать ситуации которые могут привести к исключению. Например, если взять пример приведенный выше, где должно произойти обращение к нулл. Добавим в метод проверку на существование объекта и создание его в случает отсутствия. Все, теперь у нас ни кода не будет возвращен null. И не надо делать подобную проверку в других местах. В итоге меньше кода, меньше ошибок, больше здоровых нервов.
В некоторых ситуациях, конечно, подобная осторожность излишняя и ,кажется, чего там из за одной переменной 2 метода создавать, но подобные мысли могут войти в привычку и Вы будете лепить глобальные переменные где можно и где нельзя.
Запомните, глобальные переменные - это темная сторона силы, она облегчит вам путь к достижению цели, но она же вас и погубит. Настоящие джедаи ни кода не пользуются глобальными переменными.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 13 янв 2013, 13:40
neoksi
KamiSempai писал(а):...
Запомните, глобальные переменные - это темная сторона силы, она облегчит вам путь к достижению цели, но она же вас и погубит. Настоящие джедаи ни кода не пользуются глобальными переменными.
Ох, почувствовал себя темным джедаем. Так как считаю использование глобальных переменных оправданным, к примеру для хранения языковой настройки.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 13 янв 2013, 14:25
rezak90
поддерживаю на счёт не использования глобальных, в андроиде на такой случай есть bundle который в свою очередь можно сделать singleton что в принципе часто и делается (это если не избежать прямой передачи из бандла в бандл, например: передать данные из фрагмента активти А в фрагмент активити Б).
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 13 янв 2013, 17:35
Finch
Не вижу ничего плохого в глобалках если использовать их с умом, там где есть необходимость и если инкапсулировать их, ну а если использовать паблик глобалки то только константы.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 13 янв 2013, 19:53
Mikhail_dev
Нередко использую глобальные переменные. getInstance() генерирует что-либо, парсит к примеру конфиг, дает значения переменным и после можно спокойно работать. Это так называемый ребут приложения, когда поправили настройки запуска. Другое дело, что они должны быть приватными
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 14 янв 2013, 01:49
djdance
стоп-стоп-стоп, товарищи, вопрос я ставлю - извините, в третий раз - именно так:
зачем нужны ПАБЛИК переменные? зачем писать publict static mVar, если мы этим пабликом никогда не пользуемся, а работаем через геттеры и сеттеры.
Re: В чем ошибка? (non-static method cannot be referenced...
Добавлено: 14 янв 2013, 02:21
rezak90
потому что в первую очередь запись "publict static mVar" чревато утечкой памяти