Зачем создавать переменные с нулевым значением
Во многих примерах кода кода я вижу переменные, устаревшие с нулевыми значениями, а затем назначенные более значимые значения.
Мне просто интересно, почему люди могут это делать. Я предполагаю, что блоки try-catch вполне могут войти в это, но я также вижу, что созданные экземпляры переменных будут иметь нулевые значения внутри блока try.
(Я уверен, что это довольно агностический вопрос, но для справки я почти полностью программирую на Java)
Все идеи оценены!
Ответы
Ответ 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 дает переменным начальное значение.