当我取消注释一个简单的方法时,应用程序崩溃

ryc*_*ies 0 java android

public class MainActivity extends AppCompatActivity
    implements OnEditorActionListener, OnClickListener{

private EditText username;
private EditText password;
private Button login;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EditText username = (EditText) findViewById(R.id.username);
    EditText password = (EditText) findViewById(R.id.password);
    Button login = (Button) findViewById(R.id.login);

    username.setOnEditorActionListener(this);
    password.setOnEditorActionListener(this);
    login.setOnClickListener(this);

    userLogin();
}

public void userLogin() {
    String usernameString = username.getText().toString();
    String passwordString = password.getText().toString();

}

@Override
public void onClick(View v) {

}

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    return false;
}
}
Run Code Online (Sandbox Code Playgroud)

取消注释"userLogin()"时应用程序崩溃.我没有收到错误消息或任何迹象表明它崩溃的原因.模拟器只是说"登录屏幕已停止".

我是Android开发的新手,所以任何帮助都将不胜感激.

Ben*_* P. 6

这是Java变量"阴影"的问题.您的计划的重点是:

// these are instance variables
private EditText username;
private EditText password;
Run Code Online (Sandbox Code Playgroud)

并在 onCreate()

// these are local variables
EditText username = (EditText) findViewById(R.id.username);
EditText password = (EditText) findViewById(R.id.password);
Run Code Online (Sandbox Code Playgroud)

问题是,usernamepassword您使用的变量onCreate()不同的,从你在类级别已经声明了的.因此,当您调用时,userLogin()您将得到一个,NullPointerException因为实例级username变量从未初始化.

如果你改变你onCreate()的样子:

username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
Run Code Online (Sandbox Code Playgroud)

然后你将不再有局部变量,一切都应该工作得很好.