Не может присваивать значение "конечной" переменной в 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
означает, что значение не изменяется.