无法在java中为“final”变量赋值

2022-09-04 05:10:58
 private void pushButtonActionPerformed(java.awt.event.ActionEvent evt)
{
    final int c=0;
    final JDialog d=new JDialog();
    JLabel l=new JLabel("Enter the Element :");
    JButton but1=new JButton("OK");
    JButton but2=new JButton("Cancel");
    final JTextField f=new JTextField(10);
    JPanel panel = new JPanel();
    but1.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            c=Integer.parseInt(f.getText());
            d.setVisible(false);
            d.dispose( );
        }
     });
but2.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        d.setVisible(false);
        d.dispose( );
    }
});
}

我使用的是 netbeans 7.1.1。这是我的代码,我已经声明“c”为“final int”,但行“c=Integer.parseInt(f.getText());”我得到一个错误“无法为最终变量分配值”。如果我从声明中删除单词 final 并使其成为 “int c” ,那么在同一行中,我得到一个错误“局部变量 c 不能从类中访问;需要声明 final”。谁能告诉我为什么会发生这种情况?


答案 1

你已经在一个函数中声明了c,然后你在这个函数中创建了一个匿名的内部类。此内部类(ActionListener)在函数终止后仍然存在 - 因此它无法将值分配给 c,因为 c 是函数的本地。

关于“final”的警告具有误导性 - 这只是编译器告诉您无法从匿名类访问瞬态局部变量。你不能仅仅通过使c成为 final 来解决这个问题,因为这会阻止对它的任何赋值,但是你可以让c成为 pushButtonActionPerformed 所在的类的实例成员。像这样:

class Something
{
    int c;

    private void pushButtonActionPerformed(java.awt.event.ActionEvent evt)
    {
        JButton but1=new JButton("OK");
        but1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                c=Integer.parseInt(f.getText());
            }
        });
    }
}

答案 2

我将跳过原因并切入解决方案:使用

final int[] c = {0};
...
c[0] = Integer.parseInt(f.getText());

有关完整故事,请参阅此帖子


推荐