Доступ к переменной из внутреннего класса в java

Я хочу получить доступ к i из метода mouseClicked. Может ли кто-нибудь помочь мне в этом?

Вот мой фрагмент кода -

for (int i = 0; i < 9; i++) {
        JLabel jl = new JLabel(String.valueOf(i));
        jl.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent evt) {

                        addAnEventToLabel(i); //Error 1
            }
        });
    }

Ошибка 1 — локальные переменные, на которые ссылается внутренний класс, должны быть окончательными или фактически окончательными (отображаемыми в IDE), но без исключений во время выполнения или во время компиляции.


person Nazeer    schedule 26.10.2017    source источник
comment
да, сообщение об ошибке говорит об этом. возможно, вы можете присвоить значение i локальной конечной переменной, а затем получить доступ к этому   -  person Jack Flamp    schedule 26.10.2017
comment
@ Джек, да, я создал локальную конечную переменную. Теперь я могу получить к этому доступ.   -  person Nazeer    schedule 26.10.2017
comment
@JackFlamp, можете ли вы объяснить мне, почему для этого нет исключений времени выполнения или времени компиляции?   -  person Nazeer    schedule 26.10.2017
comment
см. ответ gperches ниже   -  person Jack Flamp    schedule 26.10.2017


Ответы (1)


Вы должны уметь:

for (int i = 0; i < 9; i++) {
    final int tmpI = i;
    JLabel jl = new JLabel(String.valueOf(i));
    jl.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {

                    addAnEventToLabel(tmpI);
        }
    });
}
person gpeche    schedule 26.10.2017
comment
Хорошо, мы написали одно и то же в одно и то же время. это должно быть решение :) - person Jack Flamp; 26.10.2017
comment
Это сработало. Спасибо, бро. Хотите узнать больше о внутренних классах в java. - person Nazeer; 26.10.2017
comment
@gpeche, почему для этого моего кода нет исключений времени выполнения или времени компиляции? - person Nazeer; 26.10.2017
comment
@Nazeer Это ошибка компиляции, она противоречит правилам языка, поэтому компилятор просто отказывается делать из нее исполняемый файл. Исключения используются для ситуаций, когда компилятор не может знать, сбой программы или нет, поэтому он не может отказаться от компиляции исходного кода. - person gpeche; 26.10.2017
comment
Ошибки компиляции? Интересно.. Спасибо, чувак. Я сделаю больше исследований по этому поводу - person Nazeer; 26.10.2017
comment
@Nazeer docs.oracle. com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3: Any local variable, formal parameter, or exception parameter used but not declared in an inner class must either be declared final or be effectively final (§4.12.4), or a compile-time error occurs where the use is attempted. - person gpeche; 26.10.2017