local variable is accessed within inner class (jav

2019-03-18 01:21发布

I got two errors after I compiled my code.

The errors are:

1.

  local variable input is accessed within inner class; 
  needs to be declared final
     String name = input.getText();

2.

  local variable c_age is accessed within inner class; 
  needs to be declared final
     Object child_age = c_age.getSelectedItem();

This is my code:

import javax.swing.*;
import java.awt.event.*;

public class GUI
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Try GUI");
        JLabel l1 = new JLabel("Please Enter Your Child's Name");
        JTextField input = new JTextField("",10);

        JLabel l2 = new JLabel("Choose Your Child's Age");
        String[] age = {"Age","1","2","3","4","5","6"};
        JComboBox c_age = new JComboBox(age);

        JButton button = new JButton("Search");

        JTextArea result = new JTextArea();
        JScrollPane extend_area = new JScrollPane(result);

        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                String name = input.getText();
                Object child_age = c_age.getSelectedItem();
            }
        });

        JPanel panel = new JPanel();
        panel.add(l1);
        panel.add(input);
        panel.add(l2);
        panel.add(c_age);
        panel.add(button);
        panel.add(extend_area);
        frame.add(panel);
        frame.setSize(350,350);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

How can I solve this error?

8条回答
forever°为你锁心
2楼-- · 2019-03-18 01:53

You need to declare

JTextField input = new JTextField("",10);

and

JComboBox c_age = new JComboBox(age);

like this:

final JTextField input = new JTextField("",10);

final JComboBox c_age = new JComboBox(age);

This means that input and c_age cannot change:

Any local variable, used but not declared in an inner class must be definitely assigned before the body of the inner class.

Explanation taken from The Java Language Specification, Section - 8.1.3 Inner Classes and Enclosing Instances

查看更多
小情绪 Triste *
3楼-- · 2019-03-18 01:55

The JTextField named input was declared inside of the main method. You should probably do something like this:

  public class GUI{

      //declare all your components here e.g.

      JTextField input;

      public static void main(String args[]){
              new GUI();
      }

      public GUI(){
          //instantiate components here
          input = new JTextField();
          //and so on.
      }

  }

That way the reference to input inside the inner class will give no problems.

查看更多
闹够了就滚
4楼-- · 2019-03-18 01:57

As adding final takes away a lot of flexibility, I'd like to suggest the following: create an accessor method, which is encouraged anyway. But this is mostly useful when dealing with objects, while in your case everything is static. Therefore, this answer might not apply to your specific situation, but because googling for your error message yields this question as the top result, I think an alternative that's applicable in most cases (using objects is more common than doing everything from a static method) should be present here as well.

public class MyClass extends MySuperClass {
    private MyPropertyClass aProperty;

    public MyClass() {
        new JButton().setActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // aProperty.aMethod(); -- Bang! That should be final, the compiler says.
                getMyProperty().aMethod(); // -- Everything okay, works fine, no compiler complaints.
            }
        });
    }

    public getMyProperty() {
        return aProperty;
    }
}
查看更多
\"骚年 ilove
5楼-- · 2019-03-18 02:06

You have to declare final the two variables you're accesing: input and c_age.

If you don't want to do this, then you can either create a new proper class (not an ad-hoc one) and pass those as parameters in the constructor, or (I did this when working with GUIs in Java) create a listener class that takes objects in its constructor and makes them available locally, then ad-hoc instantiate that.

查看更多
Ridiculous、
6楼-- · 2019-03-18 02:07

If you declare the variables as an final then it will solve your errors but according to me its not the good solution for the problem. Similar problem has discussed here you can have a look here for more understanding.

In solution to yours problem you can have define methods by using them you can get better solution. For hint you can read How to access non-final local variable inside anonymous inner class

查看更多
够拽才男人
7楼-- · 2019-03-18 02:11

The input variable and the c_age variable disappears after the method execution is completed. You wont be allowed to use these variables inside the local inner classes unless it is final.

查看更多
登录 后发表回答