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
可以是0
或3
,那么这是有效的。 如果你想要最后一个选项申请当j
是0
以外的任何值,那么你必须检查,并将其设置为3
之前的代码。
你的代码中实际上有4 items
variables,每个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子句中实例化它。
- 亚行没有回应。 您可以等待更多,或手动杀死“adb.exe”进程,然后单击“重新启动”
- Android开发是否像iPhone一样受到限制?
- 删除ColorFilter /撤消setColorFilter
- 如何才能拉自己的Android应用程序的(私人)数据?
- 在Android Studio中查看数据库文件的内容
- 如何从Android Studio创build产品风味?
- Proguard在Parcelable类中导致RuntimeException(Unmarshalling unknown type code)
- 为什么一些Android手机导致我们的应用程序抛出java.lang.UnsatisfiedLinkError?
- FILL_AND_STROKE有什么意义?