gpt4 book ai didi

android - 无法分配局部变量,因为它是在外部定义的

转载 作者:行者123 更新时间:2023-11-30 02:33:07 24 4
gpt4 key购买 nike

我正在编写一个静态方法,但在从内部方法访问变量时遇到了问题。我在 Eclipse 中收到以下错误:

最终的局部变量 ret 无法赋值,因为它是在封闭类型中定义的

这是我的代码:

public static boolean noInternetAlertDialog(Context ctx) {
final boolean ret;

AlertDialog.Builder builder;
builder = new AlertDialog.Builder(ctx);
builder.setCancelable(false);
builder.setTitle("Error");
builder.setMessage("Connection error");

builder.setPositiveButton("Retry", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
ret = false;
}
});

builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
ret = false;
}
});
AlertDialog dialog = builder.create();
dialog.show();

if (ret)
return true;
else
return false;
}

最佳答案

重点是封闭类型的方法局部变量实际上被复制到匿名类的实例(这是因为激活框架问题,但我不会进一步详细说明,因为这与问题并不相关),这就是为什么它们需要是最终的,因为嵌套类型实例中的变量不再相同。

所以,这是第一个例子:

void foo() {
int a = 3;
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}

这不会编译,因为您不能在匿名类的方法中引用非最终变量。当您在 a 的声明中添加 final 修饰符时,a 的值将被复制到您定义的匿名类的已创建实例中。但是,不允许您更改 a 的值,因为更改对于声明 a 的方法不可见。

但是,匿名类不是静态的,也就是说,它们具有对封闭实例的引用(除非声明它们的方法是静态的),您可以使用它来修改封闭实例的变量:

int a = 3;

void foo() {
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}

这个例子确实可以编译,并且每次调用匿名类实例的 run() 方法时它都会将 a 增加 3。 (在此示例中,它从未被调用,但这只是一个示例。)

因此,总而言之,您需要将变量 seatno 从方法局部变量转换为封闭类型的实例变量。或者,如果已经存在,您需要删除 final 修饰符,因为 final 变量只能赋值一次。

更新:在 Java 8 中,引入了 effectively final 变量的概念(参见 Java 语言规范)。然而,在这篇文章的第一个例子中,变量 a 被赋值了多次,这使得它无法有效地成为 final。这意味着这个例子仍然不能用 Java 8 编译。(编译错误是“在封闭范围内定义的局部变量 a 必须是最终的或有效的最终”)

关于android - 无法分配局部变量,因为它是在外部定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27001601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com