Почему локальные переменные не инициализируются в Java? - PullRequest
93 голосов
/ 06 января 2009

Была ли какая-то причина, по которой разработчики Java считали, что локальным переменным не должно быть задано значение по умолчанию? Серьезно, если переменным экземпляра может быть присвоено значение по умолчанию, то почему мы не можем сделать то же самое для локальных переменных?

И это также приводит к проблемам, как объяснено в этом комментарии к сообщению в блоге :

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

Очень расстраивает.

Ответы [ 14 ]

0 голосов
/ 31 декабря 2014

Я мог бы подумать о следующих 2 причинах

  1. Как было сказано в большинстве ответов, наложив ограничение на инициализацию локальной переменной, гарантируется, что локальной переменной будет присвоено значение по желанию программиста, и обеспечен расчет ожидаемых результатов.
  2. Переменные экземпляра можно скрыть, объявив локальные переменные (с тем же именем) - чтобы обеспечить ожидаемое поведение, локальные переменные должны быть инициализированы значением. (Полностью избежал бы этого все же)
0 голосов
/ 04 марта 2013

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

0 голосов
/ 28 января 2009

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

0 голосов
/ 06 января 2009

Eclipse даже выдает предупреждения о неинициализированных переменных, так что в любом случае это становится совершенно очевидным. Лично я думаю, что это хорошо, что это поведение по умолчанию, иначе ваше приложение может использовать неожиданные значения, и вместо того, чтобы компилятор выдавал ошибку, оно ничего не сделает (но, возможно, выдаст предупреждение), и тогда вы будете чесать твоя голова о том, почему некоторые вещи ведут себя не так, как должны.

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