我有这堂课:
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,因为它是在封闭类型中定义的”。 有什么建议吗?
答案 0 :(得分:1)
内部类只能在最终时访问周围类的变量。这意味着您无法更改参考。由于java中的字符串是不可变的,因此您也无法更改其值。
一种可能的解决方案是使用最终StringBuilder
而不是String
,并在匿名内部类中更改其内容。
final StringBuilder rigaFile = new StringBuilder(riga);
...
try {
rigaFile.setLength(0);
rigaFile.append(r.readLine());
} catch (IOException e1) {
您还必须更改while条件,因为rigaFile
永远不会为null。要获取rigaFile
的字符串值,您可以编写rigaFile.toString()
。