为了账号安全,请及时绑定邮箱和手机立即绑定

变量无法解析

变量无法解析

慕码人2483693 2019-09-27 16:04:38
我试图创建一个项目列表,每个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可能未初始化之类的东西...如何使该程序运行?
查看完整描述

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这个代码之前。


查看完整回答
反对 回复 2019-09-27
?
猛跑小猪

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


查看完整回答
反对 回复 2019-09-27
?
繁花如伊

TA贡献2012条经验 获得超12个赞

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


if (blah) { int foo = 1; }

// foo is no longer visible here

因此,一旦到达该大括号},您的item变量将不再可见。例如,这与具有函数级作用域的JavaScript不同。


希望这可以帮助。


查看完整回答
反对 回复 2019-09-27
  • 3 回答
  • 0 关注
  • 834 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信