无法分配最终的局部变量“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 迭代变量 [重复]

Lambda 表达式和变量捕获

最终局部变量不能赋值,不能赋值给非最终变量

UnboundLocalError:分配前引用的局部变量“class_name”

“有效最终”的变量是啥意思? [复制]