Сообщений: 183
Тем: 8
Зарегистрирован: Dec 2011
Репутация:
89
В примере выше был примитивный тип (int bar), как он может бросить NPE ?
PHP код: <?php
class HlorkaGood {
public static Object HLORA_IS_MY_FRIEND;
...
}
// Обращаемся к переменной
...
Object test = HlorkaGood.HLORA_IS_MY_FRIEND;
...
// Будет исключение NullPointerException
тут точно будет NPE ?) По-моему там null присвоится просто
Сообщений: 247
Тем: 3
Зарегистрирован: Feb 2012
Репутация:
1,300
Хлорка
Хлорка Написал:Для тех, кто в танке:
Даже статичная переменная может вызвать исключения пакета java.lang даже при обычном одноподтечном программировании. Например, NullPointerException, UnsupportedOperationException или какой-нить еще.
Код: class HlorkaGood {
public static Object HLORA_IS_MY_FRIEND;
...
}
// Обращаемся к переменной
...
Object test = HlorkaGood.HLORA_IS_MY_FRIEND;
...
// Будет исключение NullPointerException
Поэтому что не инициализировали. Если переменная не константа, то должна иметь дефолтовое значени или полуконстанта (файл конфигурации), то используйте блоки static - это как аналог директивам Си.
Код: class HlorkaTheBest{
public static Object HLORA_IS_MY_FRIEND;
...
static {
HLORA_IS_MY_FRIEND = new String();
}
}
Для полуконстант, рекомендуется в блоке статик выполнять загрузку файла конфигурации. Если файл конфигурации имеет опии разработчика, то его как правила пихают в JAR-библиотеку, в последнем случае используют доступ к ресурсу по URL через статичный метод ClassLoader'а:
Код: InputStream s = ClassLoader.getResourceAsStream("org/mylib/test/hlorka.properties");
Тут есть 1 косяк, многие использую одноименный метод из собственного класса, т.е. HlorkaTheBest.getResourceAsStream(?), но в этом случае надо будет ставить еще 1 слеш в самом начале, иначе будет ругаться. что ресурс ненайден.
Также есть 1 удобный способ программирования, когда у вас конфиги имеют 1 тип данных, ну например все экземпляры типа String или int, то удобно запонять их из файла конфигураций через пакет Reflect, но эт уже совсем проффессионалы так делают. Это имеет смысл для каких-то текстовых сообщейни. А вообще не забывайте что в яве реализована возможность интернационализации через java.util.MessageBuilder, весьма удобно при написании мультиязычного приложения. Хотя это скорее локализация, чем интернационализация, т.к. последняя подразумевает не только смену языка.
Я извиняюсь, конечно, но какой-то несвязный бред.
1. Если переменная не константа (в случае Java, не static final), то это совершенно не означает, что ее обязательно инициализировать в месте объявления;
2. Java не позволит Вам использовать не инициализированную хоть чем-нибудь переменную. Соответственно, NPE актуален, когда переменная равна null - это разные вещи;
3. static != const вообще ни разу, почитайте что-нибудь про ООП;
4. Откуда Вы вообще взяли понятие "полустатичная переменная"? Переменная может быть static или non-static, другого не дано, Вы явно не понимаете смысл статических свойств и методов классов;
5. Для хранения загружаемых конфигов имеет смысл использовать final static, а не просто static-переменные. Применение static-переменных оправдано, потому что при создании экзмепляров классов, такие переменные не нуждаются в копировании для каждого объекта, а хранятся дружно в одном месте.
6. Чтобы использовать Reflection не нужно быть безумно-профессиональным, Reflection + Annotations могут дать довольно хороший буст в понимании написанного кода.
// aka Deft
Сообщений: 104
Тем: 13
Зарегистрирован: May 2011
Репутация:
-16
Yorie Написал:
Я извиняюсь, конечно, но какой-то несвязный бред.
1. Если переменная не константа (в случае Java, не final), то это совершенно не означает, что ее обязательно инициализировать в месте объявления; Ты читать научись где я такое писал? Я писал:
Хлорка Написал:Поэтому что не инициализировали. Если переменная не константа, то должна иметь дефолтовое значени или полуконстанта (файл конфигурации), то... На момент вызова должна иметь значение, ты смотри что написано в блоке до того как читать сообщение и тролить!
Yorie Написал:2. Java не позволит Вам использовать не инициализированную хоть чем-нибудь переменную. Соответственно, NPE актуален, когда переменная равна null - это разные вещи; Неинициализированная переменная и есть Null и вызовется тоже самое исключение. Иди отсюда!
Yorie Написал:3. static != const вообще ни разу, почитайте что-нибудь про ООП;
4. Откуда Вы вообще взяли понятие "полустатичная переменная"? Переменная может быть static или non-static, другого не дано, Вы явно не понимаете смысл статических свойств и методов классов; А я разве такое писал? Полустатическая, это я ошибся, я хотел сказать полуконстанта - это мой термин для переменных которые технически не являются константами, но программа их не меняет. А вы явно хотите выставить меня идиотом, при том что сами даже не поняли то что я написал. Непоняли небось потому что и не знали а ха ха.
Yorie Написал:5. Для хранения загружаемых конфигов имеет смысл использовать final static, а не просто static-переменные. Применение static-переменных оправдано, потому что при создании экзмепляров классов, такие переменные не нуждаются в копировании для каждого объекта, а хранятся дружно в одно месте. Вот это ты мне открытие сделал, можешь идти в школу работать. А по поводу final вы сначала лично попробуйте их в конфигах использовать, а еще лучше почитайте мой предыдущий пост о чем там вообще шла речь.
Yorie Написал:// Будет исключение NullPointerException[/PHP]
тут точно будет NPE ?) По-моему там null присвоится просто Да тут пример плохой. Нужно из Object попробовать что-то извлечь, тогда будить исключение.
Сообщений: 247
Тем: 3
Зарегистрирован: Feb 2012
Репутация:
1,300
Цитата:Ты читать научись
Цитата:Иди отсюда!
Мб не будем переходить на личности?
Цитата:Неинициализированная переменная и есть Null и вызовется тоже самое исключение
-> "Variable t might not have been initialized". C++ имеет абсолютно такую же логику для подобных ситуаций, такой код просто-напросто не скомпилится, вот и все.
"Никогда не видел такой ошибки, потому что везде пихаю foo = null" и "такой ошибки в природе не существует" - разные вещи.
Дальше комментировать не вижу смысла.
// aka Deft
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
оффтоп
Yorie Написал:Дальше комментировать не вижу смысла. вступать в "диалог" с Хлорка вообще смысла нету))
Сообщений: 12
Тем: 3
Зарегистрирован: Mar 2010
Репутация:
0
оуч... читай про классы,структуры...
приват для того и приват, что может работать только в своём круге) и делать из неё public - опасно
если можно будет к ней обратиться, то соответственно её можно будет изменить...
Сообщений: 1,485
Тем: 12
Зарегистрирован: Mar 2010
Репутация:
2,994
finfan Написал:Как правильно вызвать любую переменну?
Вроде бы методы получается вызывать, а переменные - печаль...
мои попытки вызвать переменную из _power(getPower()) из L2Skill не увенчались успехом, 100% я д*лбаеб, но вопрос мучает, до 5 утра просидел, то одна ошибка, т овторая, скачал книги, сел читать, в 8 утра уже закончил с Ширлтом и продолжил по Эккелю, но скорее всего я что-то упустил!
Подскажите пожалуйста :ej:
Только не нужно кидаться тапками
Вы видимо пытались вызвать из класса L2Skill метод, типа L2Skill.getPower().
Так делать нельзя - нужно вызывать из объекта класса, а не из самого класса - этот параметр не статический.
Нужно сначала взять скил, для примера
L2Skill skill =SkillTable.getInstance.getInfo(37,1);//Triple Slash
а потом уже посмотреть его силу
int power = skill.getPower();
|