Проверка Java, чтобы видеть, была ли переменная инициализирована - PullRequest
36 голосов
/ 22 сентября 2011

Мне нужно использовать что-то похожее на функцию isp в php. Я знаю, что php и java ЧРЕЗВЫЧАЙНО отличаются, но php - моя единственная основа предыдущих знаний о чем-то похожем на программирование. Существует ли какой-нибудь метод, который бы возвращал логическое значение для того, была ли инициализирована переменная экземпляра или нет. Например ...

if(box.isset()) {
  box.removeFromCanvas();
}

До сих пор у меня была проблема, когда я получал ошибку во время выполнения, когда моя программа пытается скрыть или удалить объект, который еще не был построен.

Ответы [ 2 ]

65 голосов
/ 22 сентября 2011

Предполагая, что вас интересует, было ли переменной явно присвоено значение или нет, ответ "не совсем". Абсолютно нет различий между полем (переменной экземпляра или переменной класса), которое еще не было явно назначено для всех , и полем, которому присвоено значение по умолчанию - 0, false, null и т. Д.

Теперь если вы знаете, что после присвоения этому значению никогда не будет переназначено значение null, вы можете использовать:

if (box != null) {
    box.removeFromCanvas();
}

(и это также позволяет избежать возможного NullPointerException), но вы должны знать, что «поле со значением null» не совпадает с «полем, которому не было явно назначено значение». Null - это совершенно допустимое значение переменной (конечно, для не примитивных переменных). В самом деле, вы даже можете изменить приведенный выше код на:

if (box != null) {
    box.removeFromCanvas();
    // Forget about the box - we don't want to try to remove it again
    box = null;
}

Разница также видна для локальных переменных, которые не могут быть прочитаны до того, как они были «определенно назначены», но одно из значений, которым они могут быть однозначно присвоены, является нулевым (для переменных ссылочного типа):

// Won't compile
String x;
System.out.println(x);

// Will compile, prints null
String y = null;
System.out.println(y);
6 голосов
/ 15 июля 2013

Переменным или полям экземпляра, наряду со статическими переменными, присваиваются значения по умолчанию в зависимости от типа переменной:

int: 0
char: '\ u0000' или 0
double: 0.0
логическое значение: false
ссылка: null

Просто хочу уточнить, что локальные переменные (т. Е. Объявленные в блоке, например, метод, для цикла, в то время как цикл, try-catch и т. Д.) Не инициализируются значениями по умолчанию и должны быть явно инициализированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...