3 回答
TA贡献1806条经验 获得超5个赞
问题是变量作用域。
if (someCondition) {
final int i = 666;
} else {
final int i = 42;
}
int j = i + 1; // compile-time error
在这里,我们有两个局部变量i,它们在声明和初始化后立即超出范围。如果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,并写了每种情况的冗长的代码(见约阿希姆·绍尔的答案),但一个更简洁的代码是使用阵列阵列代替。
final CharSequence[][] allItems = {
{ "4:45", "5:00" },
{ "4:43", "4:58" },
{ "4:41", "4:56" },
{ "4:38", "4:53" }
};
final CharSequence[] items = allItems[j];
这种技术在这种情况下效果很好,但是在更一般的情况下,您想使用a Map或类似的东西。
注:这是不是在原来的代码明确,但这个作品,如果j可以是0,1,2,或3。如果你想申请当最后一个选项j比其他任何值0,1,2,那么你必须以检查并设置到3这个代码之前。
TA贡献1858条经验 获得超8个赞
实际上items,您的代码中有4个变量,每个变量的作用域都非常有限(只有各自的代码块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
}
编辑:我忘记了new CharSequence[]这里是必需的。如果在声明过程中初始化变量,则可以省去它,但是在这里您将声明移出并使用简单的赋值来设置值。由于某种原因,定义数组的简短语法仅在初始化语句(即与声明在同一语句中的赋值)中有效。
TA贡献2012条经验 获得超12个赞
在Java中,您具有严格的块级范围,因此例如:
if (blah) { int foo = 1; }
// foo is no longer visible here
因此,一旦到达该大括号},您的item变量将不再可见。例如,这与具有函数级作用域的JavaScript不同。
希望这可以帮助。
添加回答
举报