Не может присваивать значение "конечной" переменной в java

 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 не может быть доступна изнутри класса, должна быть объявлена ​​окончательной". может кто-нибудь сказать мне, почему это происходит?

Ответы

Ответ 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());

Всю статью см. этот пост

Ответ 3

но строка "c = Integer.parseInt(f.getText());" я получаю сообщение об ошибке "не может назначить значение конечной переменной

Right. Весь смысл переменных final заключается в том, что вы можете назначать их только один раз, но вы пытаетесь назначить его дважды (один раз в параметре инициализации он равен 0, один раз в вашей кавычки). Из спецификация:

Переменная может быть объявлена ​​ final. Переменная final может быть назначена только один раз. Объявление переменной final может служить полезной документацией, что ее значение не изменится и поможет избежать ошибок программирования.

Это ошибка времени компиляции, если назначена переменная final, если она не определенно не назначена (§16) непосредственно перед назначением.

Пусто final - это переменная final, в декларации которой отсутствует инициализатор.

После назначения переменной final она всегда содержит одно и то же значение. Если переменная final содержит ссылку на объект, состояние объекта может быть изменено с помощью операций над объектом, но переменная всегда будет ссылаться на один и тот же объект.

(Их внимание, а не мое.)

Вместо того, чтобы пытаться отслеживать состояние, которое вы сохраняете в c в переменной в методе, отследите его в элементе данных в экземпляре вашего анонимного ActionListener, который вы создаете.

Ответ 4

Именно по этой причине ключевое слово final существует в java. Переменная является окончательной, т.е. Ее значение не может быть изменено. Если вам нужно изменить значение, не отмечайте переменную как final.

Ответ 5

переменная объявляется с ключевым словом final, поэтому ее значение не может быть изменено. конечная переменная как константы

Ответ 6

final делает "переменную" константой - вы не можете ее изменить. Что касается того, почему компилятор дает вам предупреждения после удаления последнего ключевого слова, нам нужно будет увидеть весь код...

EDIT:

 but1.addActionListener(new ActionListener()
 {
     public void actionPerformed(ActionEvent e)
     {
         c=Integer.parseInt(f.getText());
         d.setVisible(false);
         d.dispose( );
     }
  });

Я считаю, что это сегмент кода, который заставляет компилятор запускать предупреждение. Вы не можете использовать c в этом классе...

Ответ 7

Просто удалите ключевое слово final из объявления и продолжите свою программу. Поскольку ключевое слово final означает, что значение не изменяется.