Подтвердить что ты не робот

Зачем создавать переменные с нулевым значением

Во многих примерах кода кода я вижу переменные, устаревшие с нулевыми значениями, а затем назначенные более значимые значения.

Мне просто интересно, почему люди могут это делать. Я предполагаю, что блоки try-catch вполне могут войти в это, но я также вижу, что созданные экземпляры переменных будут иметь нулевые значения внутри блока try.

(Я уверен, что это довольно агностический вопрос, но для справки я почти полностью программирую на Java)

Все идеи оценены!

4b9b3361

Ответ 1

Компилятор Java обнаруживает в некоторых случаях, если переменная не была инициализирована во всех возможных потоках управления и печатает ошибку. Чтобы избежать этих сообщений об ошибке, необходимо явно инициализировать переменную.

Например, в этом случае:

  public Integer foo() {
    Integer result;

    if (Math.random() < 0.5) {
      result = 1;
    }

    return result;
  }

Компилятор предоставит это сообщение об ошибке: "Результат локальной переменной не может быть инициализирован".

Вот что говорит Java Language Specification:

Каждая локальная переменная (§14.4) и каждый пустой финал (§4.5.4) поле (§8.3.1.2) должно иметь определенно установленное значение, если появляется любой доступ к его значению. Компилятор Java должен нести вывести конкретный консервативный анализ потока, чтобы убедиться, что, для каждого доступа локальной переменной или пустого конечного поля f, f определенно назначается перед доступом; в противном случае ошибка компиляции должна произойти.

Обратите внимание, что (в отличие от полей!) локальные переменные автоматически не инициализируются на null.

Ответ 2

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

Даже для полей, которые начинаются как null (а затем получают значение через некоторое время после инициализации), я не являюсь их большим поклонником. Обычно это просто подчеркивает недоразумение со стороны разработчика, который это сделал.

Удовлетворение try-catch в таких случаях:

Reader r = null;
try {
    r = ...;
    //do something that could throw an exception
} finally {
    if ( r != null ) { //wouldn't compile without assignment to null
        r.close();
    }
}

Поскольку r - это локальная переменная, здесь требуется значение, прежде чем оно может быть использовано, поэтому назначение необходимо. Если присваивание null происходит в том же кодовом пути, что и его последующее переназначение и/или использование, возможно, просто вводящее в заблуждение избыточность.

Ответ 3

ДА, много раз думал об этом вопросе.

В настоящее время я обычно даю начальное значение null для объекта и бессмысленное значение для простого типа. Причина, иногда вы не уверены, что JRE дает начальное значение переменной. И иногда вам нужно судить о том, что переменная имеет значение null, возможно, вы забудете ее init. Некоторые ошибки легко найти: If дает переменным начальное значение.