我似乎无法通过网站上的所有匿名内部课程问题找到答案。
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();
}
我的登录框架包含ActionListener
。如何从login
new ActionListener()
现在我收到一个错误:
可能尚未初始化变量登录。
答案 0 :(得分:3)
您不能使用AFAIK,因为ActionListener
将首先创建,并且此时必须有权访问尚未初始化的最终变量login
。
通话顺序如下:
ActionListener
LoginFrame
构造函数login
现在假设ActionListener
构造函数将访问login
- 它不会被初始化并且会导致错误。
要解决此问题,您需要先创建框架,然后设置ActionListener
,即
final LoginFrame login = new LoginFrame();
login.addActionListener( new ActionListener() { ... } );
答案 1 :(得分: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();
答案 2 :(得分:0)
您尚未初始化变量login
,而您正在使用它。
通过anonymous class
,您正在初始化变量,因此您可以在初始化变量后使用它。如果你想使用这个变量,你必须初始化它(但永远不要用null
值初始化你的变量,因为你使用的是LoginFrame
类的方法,它必须抛出NullPointerException
)。