La variable no puede ser resuelta

Estoy tratando de crear una lista de elementos, diferente para cada variable iyj. Mi código es:

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, un error en la línea .setItems(items,

 items cannot be resolved 

Creo que el comstackdor cree que los elementos CharSequence[] items no se pueden inicializar o algo así … ¿Cómo puedo hacer que este progtwig se ejecute?

El problema es el scope variable.

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

Aquí tenemos dos variables locales i que sale del scope inmediatamente después de declararse e inicializarse. Si j necesita el valor de i , entonces tendría que ser declarado en un scope mayor.

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

(Se debe mencionar que este es exactamente el tipo de escenarios donde el operador ternario se destaca, es decir)

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

En su caso específico, lamentablemente la taquigrafía de inicializador de matriz solo se puede utilizar para inicializar al declarar. Es decir:

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

Puede extraer la statement de items fuera de if y escribir el código detallado para cada caso (consulte la respuesta de Joachim Sauer), pero un código más conciso es usar matriz de arreglos en su lugar.

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

Esta técnica funciona bien en este caso, pero en el caso más general, quiere usar un Map o algo similar.

Nota: No es explícito en el código original, pero esto funciona si j puede ser 0 , 1 , 2 o 3 . Si desea que se aplique la última opción cuando j es cualquier valor que no sea 0 , 1 , 2 , entonces debe verificarlo y configurarlo en 3 antes de este código.

En realidad, tiene 4 items variables en su código, cada uno con un scope muy limitado (solo el bloque de código del respectivo if ).

En cambio, querrás crear una variable con un scope mayor:

 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 } 

Editar: Olvidé que la new CharSequence[] es necesaria aquí. Puede dejarlo fuera si inicializa la variable durante la statement, pero aquí movió la statement y utiliza una asignación simple para establecer un valor. Por alguna razón, la breve syntax para definir una matriz solo es válida en una statement de inicialización (es decir, en una tarea que está en la misma statement que la statement).

En Java tiene un scope estricto de nivel de bloque, por ejemplo:

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

Así que una vez que llegue a esa llave de cierre} su variable de artículos ya no es visible. Esto es diferente de JavaScript, por ejemplo, donde tiene scope de nivel de función.

Espero que esto ayude.

Debido a que define (y le da un valor) a los items dentro de un bloque, solo es visible dentro de ese bloque. Saque la definición del bloque a un lugar visible para los dos fragmentos que nos ha proporcionado, y simplemente asigne un valor dentro del constructo if else .

Declarar los items antes del

 if (i == 0) { 

La forma en que lo está haciendo ahora, los items solo están dentro del scope dentro de usted if s.

Usted solo está declarando artículos en el ámbito local. Tienes que mover el

 final CharSequence[] items 

fuera de las cláusulas if y la instancia dentro de la cláusula if.