Ошибка при инициализации какого-либо значения в локальной переменной? [Дубликат]

Я задал этот вопрос более 3 лет назад, и, очевидно, ответы менялись с годами. Как уже было сказано выше, как и когда-то назад, ответ стал Да. Я никогда не обновлял принятый ответ, потому что это был правильный ответ в то время. (Я не уверен, что такое политика переполнения стека)

Я просто хотел добавить еще один ответ тем, кто все еще ищет эту тему. По состоянию на 17.05.2010 Google также объявил, что Kotlin также является официальным языком для разработки Android.

Я не нашел официального пресс-релиза, но я смотрел некоторые из них видео Google I / O , где было объявлено. Вот ссылка на запись в блоге post командой Kotlin по объявлению.

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

7 ответов

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

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

Теперь это нормально для локальных переменных, но, например, для статических переменных и переменных, компилятор не имеет способа узнать порядок в какие методы будут называться. Будет ли вызвано свойство «сеттер» перед «геттером»? Он не может знать, поэтому он не может предупредить вас об опасности. Вот почему значения по умолчанию - это , используемые для экземпляра / статические переменные - по крайней мере, тогда вы получите известное значение (0, false, null и т. Д.), А не просто «все, что было в памяти в то время «. (Он также устраняет потенциальную проблему безопасности чтения конфиденциальных данных, которые не были явно стерты.)

55
ответ дан Community 27 August 2018 в 20:05
поделиться
  • 1
    То, что я не понимаю, если объект по умолчанию по умолчанию не указан, почему вы должны назначить его null? Я думаю, что люди на языке Java решили, что в этом случае лучше быть явным, но я не уверен, согласен ли я. – James McMahon 13 October 2009 в 17:00
  • 2
    Объект не является нулевым. A variable может быть нулевым, но не объектом. И локальная переменная не имеет значения по умолчанию ... именно потому, что не имея одного средства, вы вынуждены давать ему полезное значение перед его чтением. Если вы хотите сделать это значение нулевым, это нормально ... но мне больше нравится компилятор, рассказывающий мне, пытаюсь ли я прочитать что-то, что, возможно, не было инициализировано ... – Jon Skeet 13 October 2009 в 17:03
  • 3
    @Jon Что вы подразумеваете под «& quot; Он также устраняет потенциальную проблему безопасности чтения конфиденциальных данных, которые не были явно протерты. & Quot; ? Не могли бы вы объяснить это немного? – Geek 31 July 2012 в 12:15
  • 4
    Отличный ответ, инициализация до нуля и знание того, чего ожидать, намного лучше, чем некоторый случайный выход. Это хорошее ограничение. – kiwicomb123 28 March 2017 в 11:57

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

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

0
ответ дан James Cronen 27 August 2018 в 20:05
поделиться

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

1
ответ дан monksy 27 August 2018 в 20:05
поделиться

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

7
ответ дан quosoo 27 August 2018 в 20:05
поделиться
  • 1
    +1 для " поток программы между объявлением (в методе) и ссылкой является последовательным. & quot; – luigi7up 30 January 2013 в 20:07

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

int x;  // Valid
int y;
println("y=" + y);  // Not valid since y's value has never been assigned
3
ответ дан Steve Kuo 27 August 2018 в 20:05
поделиться

В Java переменные класса и экземпляра принимают значение по умолчанию (null, 0, false), если они не инициализируются вручную. Однако локальные переменные не имеют значения по умолчанию. Если локальной переменной не присвоено значение, компилятор откажется компилировать код, который его читает. IMHO, это приводит к выводу, что инициализация локальной переменной с некоторым значением по умолчанию (например, null, которое может привести к NullPointerException позже), когда оно объявлено, на самом деле плохо. Рассмотрим следующий пример:

Object o;
if (<some boolean condition>)
  o = <some value>;
else
  o = <some other value>;
System.out.println(o);

Инициализация o с нулем совершенно не нужна, поскольку компилятор Java проверяет во время компиляции, что любой путь кода инициализирует o (с нулевым или некоторое ненулевое значение) перед чтением переменной. Это означает, что компилятор откажется компилировать строку System.out.println(o);, если вы прокомментируете любую из двух инициализаций переменной o в фрагменте кода выше.

Это выполняется для Java и возможно, только для Java. Я не знаю о языке, как C #. Тем не менее, в хорошем старом C (и, возможно, C ++), всегда рекомендуется инициализировать переменные при объявлении их AFAIK. Такие «старые школьные» языки программирования могут быть причиной того, что рекомендация всегда инициализировать переменные появляется в книгах и дискуссиях о современных языках, таких как Java, где компилятор отслеживает, была ли инициализирована переменная или нет.

6
ответ дан Sven 27 August 2018 в 20:05
поделиться
  • 1
    «Старая школа» языки не рекомендуют объявлять переменную до тех пор, пока у вас не будет значения для ее ввода. :-) – Bo Persson 14 January 2012 в 17:30
  • 2
    Рассмотрим приведенный выше пример. Как вы можете получить значение для ввода переменной, если значение зависит от результата сложного оператора if. ИМХО, правило, которое вы предлагаете, имеет большую проблему. – Sven 13 May 2016 в 14:22
  • 3
    Если значение требует сложных вычислений, вы можете поместить их в отдельную функцию и использовать вызов функции в качестве инициализатора. – Bo Persson 13 May 2016 в 14:27

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

И как основное правило, мы всегда должны инициализировать любую переменную перед использованием Это. В противном случае это может привести к ошибке, например, nullPointer и т. Д.

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

Поэтому, когда стек закончит значение локального метода, поэтому они должны быть инициализированы явно (когда мы их используем) 2] Они не должны быть инициализированы неявно (с помощью null, 0 или false), например, переменные экземпляра

0
ответ дан Venantius 27 August 2018 в 20:05
поделиться
Другие вопросы по тегам:

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