Переменная не может быть разрешена

Я пытаюсь создать список элементов, различный для каждой переменной i и j. Мой код:

if (i == 0) { if (j == 0) { final CharSequence[] items = {"4:45", "5:00"} } else if (j == 1) { final CharSequence[] items = {"4:43", "4:58"} } else if (j == 2) { final CharSequence[] items = {"4:41", "4:56"} } else { final CharSequence[] items = {"4:38", "4:53"} } 

 new AlertDialog.Builder(this) .setTitle("Hours") .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { // getStation(i); } }) .show(); } 

Я получаю сообщение об ошибке в строке .setItems(items,

 items cannot be resolved 

Я думаю, что компилятор считает, что CharSequence[] items не могут быть инициализированы или что-то еще … Как я могу запустить эту программу?

Проблема заключается в переменном охвате.

 if (someCondition) { final int i = 666; } else { final int i = 42; } int j = i + 1; // compile-time error 

Здесь мы имеем две локальные переменные i которые выходят за frameworks сразу после их объявления и инициализации. Если j нуждается в значении i , тогда i должен быть объявлен в более широкой области.

 final int i; if (someCondition) { i = 666; } else { i = 42; } int j = i + 1; // compiles fine! 

(Следует отметить, что это именно те сценарии, где превосходит трёхмерный оператор, т. Е.

 final int i = (someCondition) ? 666 : 42; 

В вашем конкретном случае, к сожалению, сокращение инициализатора массива может использоваться только для инициализации при объявлении. То есть:

 int[] arr1 = { 1, 2, 3 }; // compiles fine! int[] arr2; arr2 = { 4, 5, 6 }; // doesn't compile! 

Вы можете вытащить декларацию items за пределами if и написать подробный код для каждого случая (см. Ответ Joachim Sauer), но более сжатый код – использовать массивы массивов.

 final CharSequence[][] allItems = { { "4:45", "5:00" }, { "4:43", "4:58" }, { "4:41", "4:56" }, { "4:38", "4:53" } }; final CharSequence[] items = allItems[j]; 

Этот метод хорошо работает в этом случае, но в более общем случае вы хотите использовать Map или что-то подобное.

Примечание: в исходном коде явно не указано, но это работает, если j может быть 0 , 1 , 2 или 3 . Если вы хотите, чтобы последний параметр применялся, когда j – любое значение, отличное от 0 , 1 , 2 , вы должны проверить это и установить его до 3 перед этим кодом.

У вас на самом деле есть 4 items переменных в вашем коде, каждый из которых имеет очень ограниченную область действия (только код-блок соответствующего if ).

Вместо этого вы захотите создать одну переменную с большей областью действия:

 if (i == 0) { final CharSequence[] items; if (j == 0) { items = new CharSequence[] {"4:45", "5:00"}; } else if (j == 1) { items = new CharSequence[] {"4:43", "4:58"}; } else if (j == 2) { items = new CharSequence[] {"4:41", "4:56"}; } else { items = new CharSequence[] {"4:38", "4:53"}; } // you can use items here } 

Edit: Я забыл, что здесь new CharSequence[] . Вы можете оставить его, если вы инициализируете переменную во время объявления, но здесь вы переместили объявление и использовали простое назначение для установки значения. По какой-то причине короткий синтаксис определения массива действителен только в инструкции initializaton (т. Е. В присваивании, которое находится в том же самом заявлении, что и объявление).

В Java у вас строгая область блочного уровня, например:

 if (blah) { int foo = 1; } // foo is no longer visible here 

Итак, как только вы достигнете этой закрывающей фигурной скобки}, ваша переменная элементов больше не видна. Это отличается от JavaScript, например, если у вас есть область функционального уровня.

Надеюсь это поможет.

Поскольку вы определяете (а также задаете значение) items внутри блока, они видны только внутри этого блока. Извлеките определение из блока, чтобы он был видимым для обоих fragmentов, которые вы нам предоставили, и просто назначьте значение в конструкции if else .

Объявлять items до

 if (i == 0) { 

То, как вы делаете это сейчас, items находятся только внутри области внутри вас, if s.

Вы объявляете только объекты в локальной области. Вам нужно переместить

 final CharSequence[] items 

вне предложений if и создать экземпляр внутри предложения if.

  • Изменение цвета плавающей кнопки Android
  • Как перемещать маркер вдоль полилинии с помощью карты google
  • JAVA не может статически ссылаться на нестатические поля
  • Подписывает ли подпись метода в Java свой тип возврата?
  • Что такое обратный вызов в Android?
  • Создайте ListView с выбираемыми строками / измените цвет фона строк ListView при нажатии
  • Почему конструктор по умолчанию требуется в родительском classе, если он имеет аргумент-редактор?
  • декомпиляция DEX в исходный код Java
  • Как я могу захватить вывод команды как String с Commons Exec?
  • Можно ли использовать Java 8 для разработки Android?
  • Неправильный Manifest.mf в IntelliJ IDEA создан .jar
  • Давайте будем гением компьютера.