【问题标题】:The final local variable "name" cannot be assigned, since it is defined in an enclosing type无法分配最终的局部变量“name”,因为它是在封闭类型中定义的
【发布时间】:2024-05-15 16:05:01
【问题描述】:

我有这门课:

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,因为它是在封闭类型中定义的”。 对此有何建议?

【问题讨论】:

  • 你认为异常告诉你什么?再清楚不过了。

标签: java class variables methods visibility


【解决方案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),因为它们是可变的,即您可以更改现有对象的值。
最近更新 更多