4

I can't seem to find an answer to this through all the anonymous inner class questions on the site.

public void start()
{
    /* Ask the user to login */
    final LoginFrame login;
    login = new LoginFrame(new ActionListener()
    {
        @Override
        public void actionPerformed(final ActionEvent event)
        {
            switch (event.getActionCommand())
            {
                case "login":
                    /* @todo Login the user */
                    String username = login.getUsername();
                    String password = login.getPassword();
            }
        }
    });
    login.display();
}

My login frame takes in an ActionListener. How do I access login from within the new ActionListener()?

Right now I'm getting an error:

Variable login may not have been initialized.

4

3 回答 3

3

AFAIK 你不能因为ActionListener将首先创建,那时必须有权访问login尚未初始化的最终变量。

调用顺序如下:

  • 创建一个实例ActionListener
  • 将该实例传递给LoginFrame构造函数
  • 将创建的框架分配给login

现在假设ActionListener构造函数可以访问login——它还没有被初始化并且会导致错误。

要解决此问题,您需要先创建框架,然后设置ActionListener,即

final LoginFrame login = new LoginFrame();
login.addActionListener( new ActionListener() { ... } );
于 2014-03-27T09:54:43.707 回答
1

您必须在创建ActionListener后分配LoginFrame

login正如编译器告诉您的那样,首先或在分配字段之前评估分配的右侧。

对于侦听器来说,更常见的是有一个add方法,所以我将代码更改为:

private final login = new LoginFrame();

login.addActionListener(
  new ActionListener()
  {
    @Override
    public void actionPerformed(final ActionEvent event)
    {
      switch (event.getActionCommand())
      {
        case "login":
          /* @todo Login the user */
          String username = login.getUsername();
          String password = login.getPassword();
      }        
    }      
  }
);    

login.display();
于 2014-03-27T09:58:52.510 回答
0

你还没有初始化你的变量login,你正在使用它。

通过 your anonymous class,您正在初始化变量,因此您可以在初始化后使用它。如果你想使用这个变量,你必须初始化它(但永远不要用nullvalue 初始化你的变量,因为你使用的是LoginFrame类的方法,它必须 throw NullPointerException)。

于 2014-03-27T09:59:56.663 回答