Java: Локальная переменная mi, определенная в охватывающей области, должна быть окончательной или эффективно конечной

Я получаю ошибку, как в теме, и я любезно спрашиваю вас, как ее восстановить … ERROR находится в menuItem-loop, где я пытаюсь установить цвет переднего плана textArea в один выбранный из menuItem: (colors [mi])

String[] colors = { "blue", "yellow", "orange", "red", "white", "black", "green", }; JMenu mnForeground = new JMenu("Foreground"); for (int mi=0; mi<colors.length; mi++){ String pos = Character.toUpperCase(colors[mi].charAt(0)) + colors[mi].substring(1); JMenuItem Jmi =new JMenuItem(pos); Jmi.setIcon(new IconA(colors[mi])); Jmi.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JMenuItem item = (JMenuItem) e.getSource(); IconA icon = (IconA) item.getIcon(); Color kolorIkony = getColour(colors[mi]); // ERROR HERE: (colors[mi]) textArea.setForeground(kolorIkony); } }); mnForeground.add(Jmi); } public Color getColour(String colour){ try { kolor = Color.decode(colour); } catch (Exception e) { kolor = null; } try { final Field f = Color.class.getField(colour); kolor = (Color) f.get(null); } catch (Exception ce) { kolor = Color.black; } return kolor; } 

Ошибка означает, что вы не можете использовать локальную переменную mi внутри внутреннего classа .


Чтобы использовать переменную внутри внутреннего classа, вы должны объявить ее final . Пока mi является счетчиком цикла и final переменные не могут быть назначены, вы должны создать обходное решение для получения значения mi в final переменной, доступ к которой возможен во внутреннем classе:

 final Integer innerMi = new Integer(mi); 

Таким образом, ваш код будет выглядеть так:

 for (int mi=0; mi 

Да, это происходит потому, что вы получаете доступ mi переменной mi из вашего анонимного внутреннего classа, что происходит глубоко внутри, так это то, что создается другая копия вашей переменной и будет использоваться внутри анонимного внутреннего classа, поэтому для согласованности данных компилятор попытается ограничить вас от изменения значения mi , поэтому он говорит вам, чтобы установить его окончательный.

Здесь у вас есть нелокальная переменная ( https://en.wikipedia.org/wiki/Non-local_variable ), то есть вы получаете доступ к локальной переменной в методе анонимного classа.

Локальные переменные метода хранятся в стеке и теряются, как только метод заканчивается, однако даже после завершения метода локальный внутренний объект classа все еще жив в куче и ему нужно будет получить доступ к этой переменной (здесь, когда действие выполняется).

Я бы предложил два actionlistenner обхода: либо вы создаете свой собственный class, который реализует actionlistenner и принимает в качестве аргумента конструктора вашу переменную и сохраняет ее как атрибут classа. Поэтому вы должны получить доступ только к этой переменной внутри одного и того же объекта.

Или (и это, вероятно, лучшее решение) просто квалифицируйте копию переменной final чтобы получить доступ к ней во внутренней области, поскольку ошибка предполагает сделать ее постоянной:

Это подойдет вашему делу, так как вы не изменяете значение переменной.

  • Безопасная публикация HTTP на Android
  • Есть ли на установке событие в android?
  • Измените значки отмеченных и непроверенных для флажка для Android
  • путь к файлу Windows в формате java
  • Исходный ресурс Android не найден?
  • Добавить ярлык для приложения для Android. На главный экран.
  • Не можете начать сервис? (Рекорд речи)
  • Объявление float, почему default type double?
  • Как проверить тип переменной в Java?
  • java - игнорировать сертификат ssl
  • Разделить строку на отдельные слова Java
  • Давайте будем гением компьютера.