Java 最后一个局部变量";名称“;无法分配,因为它是在封闭类型中定义的

Java 最后一个局部变量";名称“;无法分配,因为它是在封闭类型中定义的,java,class,variables,methods,visibility,Java,Class,Variables,Methods,Visibility,我有这门课: class Tester{ final String rigaFile=riga; final BufferedReader r=new BufferedReader(reader2); fr.getList().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) {

我有这门课:

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();
                    }
                }

            }

        }
    });

}
类测试器{
最终管柱刚度文件=刚度;
最终BufferedReader r=新的BufferedReader(读取器2);
fr.getList().addListSelectionListener(新ListSelectionListener()){
public void值已更改(ListSelectionEvent e){
如果(!e.getValueIsAdjusting()){
//fr.getLabel().setText(fr.getList().getSelectedValue().toString());
while(rigaFile!=null)
{                   
String[]parts=rigaFile.split(“\t”);

for(int i=0;i内部类只能在其为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()

你认为异常告诉你什么?它再清楚不过了。你想从
列表选择监听器
内部更改
rigaFile
,它在
测试仪中声明。这是不可能的,因为它必须是最终的。诀窍是将
rigaFile
声明为
StringBuffere> (或
StringBuilder
),因为它们是可变的,即您可以更改现有对象的值。