Почему должен локальные переменные, включая примитивы, всегда быть инициализированным в Java?

игрой Runescape является единственное JAVA-приложение (это имеет настольный клиент в Windows), что я использую, который не является IDE/редактором/профилировщиком.

52
задан Martijn Courteaux 13 October 2009 в 03:48
поделиться

5 ответов

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

Теперь это нормально для локальных переменных, но для экземпляров и статических переменных компилятор не имеет возможности узнать порядок, в котором будут выполняться методы. называется. Будет ли вызываться свойство «установщик» перед «получателем»? У него нет способа узнать, поэтому он не может предупредить вас об опасности. Который' s почему значения по умолчанию - это , используемые для экземпляров / статических переменных - по крайней мере, тогда вы получите известное значение (0, false, null и т. д.) вместо того, чтобы просто «то, что случилось в памяти в тот момент». " (Это также устраняет потенциальную проблему безопасности при чтении конфиденциальных данных, которые не были явно удалены.)

Совсем недавно возник вопрос об этом для C # ... - прочтите также ответы там , так как это в основном одно и то же. Вам также может показаться интересным недавнее сообщение в блоге Эрика Липперта ; по крайней мере, это примерно та же область, хотя и имеет несколько другую тягу.

(Это также устраняет потенциальную проблему безопасности при чтении конфиденциальных данных, которые не были явно удалены.)

Совсем недавно возник вопрос об этом для C # ... - прочтите также ответы там , так как это в основном одно и то же. Вам также может показаться интересным недавнее сообщение в блоге Эрика Липперта ; по крайней мере, это примерно та же область, хотя и имеет несколько другую тягу.

(Это также устраняет потенциальную проблему безопасности при чтении конфиденциальных данных, которые не были явно удалены.)

Совсем недавно был вопрос об этом для C # ... - прочтите также ответы там , так как это в основном одно и то же. Вы также можете найти интересную недавнюю запись в блоге Эрика Липперта ; это, по крайней мере, примерно такая же область, хотя и имеет несколько другую тягу.

67
ответ дан 7 November 2019 в 09:23
поделиться

Не совсем так. Локальные переменные нужно инициализировать, только если они являются ссылочными. Локальную переменную можно оставить неинициализированной, если на нее не ссылаются. Например:

int x;  // Valid
int y;
println("y=" + y);  // Not valid since y's value has never been assigned
6
ответ дан 7 November 2019 в 09:23
поделиться

Локальные переменные и примитивы должны быть инициализированы перед использованием, потому что вы знаете, чего ожидать от значений. Исторически сложилось так, что когда создавалась новая переменная, она содержала случайные значения из памяти [и нельзя было предсказать значение]. Java также требует этого, потому что предотвращает наличие потерянных переменных.

1
ответ дан 7 November 2019 в 09:23
поделиться

На практике все переменные должны быть инициализированы перед их использованием.

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

0
ответ дан 7 November 2019 в 09:23
поделиться

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

8
ответ дан 7 November 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: