可能重复:
Java local variable visibility in anonymous inner classes - why is ‘final’ keyword required?
我有这个功能可以创建一些按钮。我正在尝试在 doAction 方法中out.println item 。
for (int i = 0; i < itemsList.size(); i++) {
String item = itemsList.get(i);
TButton button = new TButton("" + item, 8, 415 + (25 * i), 90, 25) {
public void doAction() {
System.out.println("" + item);
}
};
this.framework.add(button);
}
我收到了错误
local variable item is accessed from within inner class
我该如何正确地做到这一点?
答案 0 :(得分:3)
将item
标记为final
,这应该可以解决问题。这solution
:
本地类可以绝对引用实例变量。该 他们不能引用非最终局部变量的原因是因为 方法返回后,本地类实例可以保留在内存中。 当方法返回局部变量时,超出范围,所以复制 他们是需要的。如果变量不是最终的那么副本 方法中的变量可以更改,而本地类中的副本 没有,所以他们不同步。
匿名内部类因为方式而需要最终变量 它们是用Java实现的。匿名内部类(AIC)使用 通过创建一个包含一个私有实例字段的局部变量 局部变量值的副本。内部阶级不是 实际上使用局部变量,但副本。应该是公平的 在这一点上显而易见的是,如果要么“坏事”可能会发生 原始值或复制值的变化;会有一些 意外的数据同步问题。为了防止这种情况 有点问题,Java要求你标记将要的局部变量 被AIC用作最终的(即不可更改的)。这保证了 内部类的局部变量副本将始终匹配 实际值。
答案 1 :(得分:2)
制作item
final应解决您的问题:
final String item = itemsList.get(i);
您无法像这样从内部或匿名类访问非最终本地变量。
答案 2 :(得分:1)
您需要使用final
关键字。
尝试final String item=itemsList.get(i)
;
由于匿名对象捕获item
变量,因此在之后修改它是没有意义的。因此,您需要(拥有)使其不可变。