Я получаю сообщение об ошибке в строке .setItems(items,:
items cannot be resolved
Я думаю, что компилятор считает, что CharSequence[] items возможно, не инициализирована или что-то в этом роде... Как я могу запустить эту программу?
Переведено автоматически
Ответ 1
На самом деле в вашем коде есть 4 items переменные, каждая с очень ограниченной областью действия (только блок кода соответствующей if).
Вместо этого вы захотите создать одну переменную с большей областью видимости:
if (i == 0) { final CharSequence[] items; if (j == 0) { items = newCharSequence[] {"4:45", "5:00"}; } elseif (j == 1) { items = newCharSequence[] {"4:43", "4:58"}; } elseif (j == 2) { items = newCharSequence[] {"4:41", "4:56"}; } else { items = newCharSequence[] {"4:38", "4:53"}; } // you can use items here }
Редактировать: я забыл, что new CharSequence[] здесь необходимо. Вы можете не указывать это, если инициализируете переменную во время объявления, но здесь вы убрали объявление и используете простое присваивание для установки значения. По какой-то причине краткий синтаксис определения массива только допустим в операторе инициализации (т. Е. В присваивании, которое находится в том же операторе, что и объявление).
Ответ 2
Проблема заключается в области видимости переменной.
if (someCondition) { finalinti=666; } else { finalinti=42; } intj= i + 1; // compile-time error
Здесь у нас есть две локальные переменные, i которые выходят за пределы области видимости сразу после их объявления и инициализации. Если j требуется значение i, то i должно быть объявлено в большей области видимости.
finalint i; if (someCondition) { i = 666; } else { i = 42; } intj= i + 1; // compiles fine!
(Следует отметить, что это именно тот тип сценариев, в которых троичный оператор превосходит, т.е.)
finalinti= (someCondition) ? 666 : 42;
В вашем конкретном случае, к сожалению, сокращение инициализатора массива может использоваться только для инициализации при объявлении. То есть:
Вы можете извлечь объявление items за пределы if и написать подробный код для каждого случая (см. Ответ Иоахима Зауэра ), но более лаконичный код заключается в использовании вместо него массива массивов.
Этот метод хорошо работает в данном случае, но в более общем случае вы хотите использовать Map или что-то подобное.
Примечание: Это не указано явно в исходном коде, но это работает, если j может быть 0, 1, 2 или 3. Если вы хотите, чтобы последний параметр применялся, когда j имеет любое значение, отличное от 0, 1, 2, то вам нужно проверить это и установить для него значение 3 перед этим кодом.
Ответ 3
В Java у вас строгая область действия на уровне блоков, поэтому, например:
if (blah) { intfoo=1; } // foo is no longer visible here
Итак, как только вы достигнете этой закрывающей фигурной скобки }, ваша переменная items больше не будет видна. Это отличается от JavaScript, например, где у вас есть область действия на уровне функции.
Надеюсь, это поможет.
Ответ 4
Поскольку вы определяете (а также присваиваете значение) items внутри блока, она видна только внутри этого блока. Извлеките определение из блока в место, видимое обоим фрагментам, которые вы нам дали, и просто присвоите значение внутри ifelse конструкции.