Почему переменные, определенные в блоке case, доступны в других блоках case? [дубликат]

Возможные Дубликаты:
почему переменные не являются локальными в операторах case?

переменная, определенная в блоке области, не может использоваться вне его. Например, недопустим следующий фрагмент кода:

{
    int anothervar = 4;
}
{
    System.out.println(anothervar);
}

но это похоже на case блок не создает отдельные области.

switch (mode) {
    case ONE:
        dosomething();
        return;
    case TWO:
        int[] someints = new int[] { 2, 3, 5, 7 };
        SomeObject obj = new SomeObject();
        return;
    case THREE:
        someints = new int[] { 1, 4, 6, 8, 9 };
        obj = new SomeObject();
        return;
}

почему бы мне не объявить someints внутри case THREE "блок"?
Предполагать mode = THREE, затем объявление переменной someints никогда не достигается, потому что case TWO, где someints объявлено, пропущено. Или нет? как это работает внутри?

(выбранный ответ в почему переменные не являются локальными в операторах case? заявляет, что оператор switch является внутренним набором jump команды, но все равно это не объясняет, где переменная someints объявлена.)

5 ответов


объем локальной переменной внутри блока, как указано в имена документация:

область объявления локальной переменной в блоке (§14.4.2) является остальная часть блока, в котором появляется объявление, начиная с собственный инициализатор (§14.4) и включение любых дополнительных деклараторов в прямо в инструкции объявления локальной переменной.

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

блок-это последовательность операторов, локальных объявлений классов и операторы объявления локальных переменных в фигурных скобках.


вот почему вы иногда видите код с:

case 0: {
   // Stuff
}

только {} разделяет блоки.


область объявления помечена { ... } и вы можете упасть из одного случая в секунду. Я признаю, что это дыра. Я считаю, что в более старой версии Java не было разрешено объявлять на


в дополнение к другим ответчикам (как они заметили, область между {} здесь только одна) я хотел бы заметить, что такая практика: объявление переменной в одном случае и использование ее в другом, является грязный. Позже вы можете удалить или изменить какой-либо случай. И если это будет тот, с декларацией, вам придется изменить другой случай. Это может привести к ошибкам.

подумайте хорошенько-почему ваша переменная someints должна быть в обоих случаях? Это действительно одно и то же или два разных?

Если это то же самое: Лучше объявить общие переменные в случае по умолчанию и поместить его в качестве первого.

switch (mode) {
    default:
        int[] someints;
        return;
    case ONE:
        dosomething();
        return;
    case TWO:
        someints = new int[] { 2, 3, 5, 7 };
        SomeObject obj = new SomeObject();
        return;
    case THREE:
        someints = new int[] { 1, 4, 6, 8, 9 };
        obj = new SomeObject();
        return;
}

или объявить их из блока коммутатора (это хуже). Или поместите его где-нибудь, где вы определяете константы.

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

кстати: это действительно хороший вопрос!


все, что внутри { } находится в той же области. Если вы достанете return; в случае два, например, вы можете использовать переменную в случае три, если она инициализирована.