猿问

变量无法解析

我试图创建一个项目列表,每个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可能未初始化之类的东西...如何使该程序运行?


慕码人2483693
浏览 835回答 3
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,并写了每种情况的冗长的代码(见约阿希姆·绍尔的答案),但一个更简洁的代码是使用阵列阵列代替。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这个代码之前。

猛跑小猪

实际上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[]这里是必需的。如果在声明过程中初始化变量,则可以省去它,但是在这里您将声明移出并使用简单的赋值来设置值。由于某种原因,定义数组的简短语法仅在初始化语句(即与声明在同一语句中的赋值)中有效。

繁花如伊

在Java中,您具有严格的块级范围,因此例如:if (blah) { int foo = 1; }// foo is no longer visible here因此,一旦到达该大括号},您的item变量将不再可见。例如,这与具有函数级作用域的JavaScript不同。希望这可以帮助。
随时随地看视频慕课网APP

相关分类

Java
Android
我要回答