变量无法解决

时间:2010-04-06 14:37:32

标签: java android

我正在尝试为每个i和j变量创建一个项目列表。我的代码是:

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可能没有初始化或者某些东西...... 如何让这个程序运行?

6 个答案:

答案 0 :(得分:6)

您的代码中实际上有4个items个变量,每个变量的范围非常有限(只有相应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[]。如果在声明期间初始化变量,则可以将其保留,但在此处您将声明移出并使用简单赋值来设置值。由于某种原因,定义数组的短语法在初始化语句中只有 有效(即在与声明声明相同的赋值中)。

答案 1 :(得分:3)

问题在于变量范围。

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的声明并为每个案例编写详细代码(请参阅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可以是0123,则此方法有效。如果您希望在j012以外的任何值时应用最后一个选项,那么您必须检查并将其设置为{{ 1}}在此代码之前。

答案 2 :(得分:2)

在Java中,您有严格的块级范围,例如:

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

因此,一旦你达到那个结束大括号},你的items变量就不再可见了。这与JavaScript不同,例如您具有功能级范围。

希望这有帮助。

答案 3 :(得分:1)

因为您在块中定义(以及赋值)items,所以它只能在该块中可见。将定义从块中拉出到您提供给我们的两个片段可见的位置,然后if else构造中分配值

答案 4 :(得分:1)

之前声明items
if (i == 0) {

您现在的行为方式,items仅限于内部if内的范围。

答案 5 :(得分:0)

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

final CharSequence[] items
在if子句之外,并在if子句中实例化它。