variables无法parsing

我正在尝试创build一个项目列表,不同的每个我和jvariables。 我的代码是:

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 

这里我们有两个局部variables,我们在声明和初始化后立即超出范围。 如果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! 

你可以在if之外提取items的声明,并为每个案例编写冗长的代码(请参阅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可以是03 ,那么这是有效的。 如果你想要最后一个选项申请当j0以外的任何值,那么你必须检查,并将其设置为3之前的代码。

你的代码中实际上有4 itemsvariables,每个variables的范围非常有限(只有各自的代码块)。

相反,你会想创build一个更大范围的variables:

 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 } 

编辑:我忘了new CharSequence[]在这里是必要的。 如果在声明期间初始化variables,则可以省略,但是在这里您将声明移出并使用简单的赋值来设置值。 由于某种原因,定义数组的简短语法在初始化语句中有效(即,在与声明相同的语句中的赋值中)。

在Java中,您有严格的块级作用域,例如:

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

所以,一旦你达到那个结束大括号}你的项目variables不再可见。 这与JavaScript有所不同,例如您有function级别的范围。

希望这可以帮助。

因为你定义了一个块内的items (也给它一个值),所以只能在该块内看到。 将定义从块中拉出来,放到您给我们的片段可见的地方,然后在if else结构中分配一个值

申报items

 if (i == 0) { 

你现在正在做的事情,只有在s的范围内, items才在你的范围内。

你只是在本地范围内声明项目。 你需要移动

 final CharSequence[] items 

在if子句之外,并在if子句中实例化它。