无法分配最终的局部变量“name”,因为它是在封闭类型中定义的
Posted
技术标签:
【中文标题】无法分配最终的局部变量“name”,因为它是在封闭类型中定义的【英文标题】:The final local variable "name" cannot be assigned, since it is defined in an enclosing type 【发布时间】:2013-11-30 17:33:55 【问题描述】:我有这门课:
class Tester
final String rigaFile=riga;
final BufferedReader r=new BufferedReader(reader2);
fr.getList().addListSelectionListener(new ListSelectionListener()
public void valueChanged(ListSelectionEvent e)
if (!e.getValueIsAdjusting())
// fr.getLabel().setText(fr.getList().getSelectedValue().toString());
while(rigaFile!=null)
String[] parts=rigaFile.split("\t");
for(int i=0;i<dim;i++)
if(listaPath.get(i).equals(parts[1]) && parts[1].substring(parts[1].lastIndexOf('/')+1, parts[1].length()).equals(fr.getList().getSelectedValue().toString()))
fr.getLabel().setText(fr.getList().getSelectedValue().toString());
try
rigaFile=r.readLine();
catch (IOException e1)
// TODO Auto-generated catch block
e1.printStackTrace();
);
变量“rigaFile”抛出以下错误: “无法分配最终的局部变量 rigaFile,因为它是在封闭类型中定义的”。 对此有何建议?
【问题讨论】:
你认为异常告诉你什么?再清楚不过了。 【参考方案1】:内部类只有在它们是 final 时才能访问周围类的变量。这意味着您不能更改参考。由于 java 中的字符串是不可变的,因此您也无法更改其值。
一种可能的解决方案是使用最终的StringBuilder
而不是String
,并在您的匿名内部类中更改其内容。
final StringBuilder rigaFile = new StringBuilder(riga);
...
try
rigaFile.setLength(0);
rigaFile.append(r.readLine());
catch (IOException e1)
您还必须更改您的 while 条件,因为 rigaFile
永远不会为空。要获取rigaFile
的字符串值,您可以编写rigaFile.toString()
。
【讨论】:
您想从您的ListSelectionListener
内部更改rigaFile
,它在Tester
中声明。这是不可能的,因为它是并且必须是最终的。诀窍是将rigaFile
声明为StringBuffer
(或StringBuilder
),因为它们是可变的,即您可以更改现有对象的值。以上是关于无法分配最终的局部变量“name”,因为它是在封闭类型中定义的的主要内容,如果未能解决你的问题,请参考以下文章
无法分配给项目,因为它是一个 foreach 迭代变量 [重复]