我正在使用登录和注册系统,并且在尝试点按“登录”时遇到此错误。按钮。
08-06 00:36:19.258 25808-25808/com.kylek.hatework E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.kylek.hatework, PID: 25808
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at com.kylek.hatework.Login.onClick(Login.java:42)
at android.view.View.performClick(View.java:5254)
at android.view.View$PerformClick.run(View.java:21173)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6837)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
这是我的Login.java
package com.kylek.hatework;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Login extends ActionBarActivity implements View.OnClickListener {
Button bLogin;
TextView registerLink;
EditText etUsername, etPassword;
String username, password;
UserLocalStore userLocalStore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
bLogin = (Button) findViewById(R.id.bLogin);
etUsername = (EditText) findViewById(R.id.etUsername);
etPassword = (EditText) findViewById(R.id.etPassword);
registerLink = (TextView) findViewById(R.id.tvRegisterLink);
bLogin.setOnClickListener(this);
registerLink.setOnClickListener(this);
userLocalStore = new UserLocalStore(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.bLogin:
Log.v("username", etUsername.getText().toString());
Log.v("password", etPassword.getText().toString());
User user = new User(username, password);
authenticate(user);
break;
case R.id.tvRegisterLink:
Intent registerIntent = new Intent(Login.this, Register.class);
startActivity(registerIntent);
break;
}
}
private void authenticate(User user) {
ServerRequests serverRequest = new ServerRequests(this);
serverRequest.fetchUserDataAsyncTask(user, new GetUserCallback() {
@Override
public void done(User returnedUser) {
if (returnedUser == null) {
showErrorMessage();
} else {
logUserIn(returnedUser);
}
}
});
}
private void showErrorMessage() {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(Login.this);
dialogBuilder.setMessage("Incorrect user details");
dialogBuilder.setPositiveButton("Ok", null);
dialogBuilder.show();
}
private void logUserIn(User returnedUser) {
userLocalStore.storeUserData(returnedUser);
userLocalStore.setUserLoggedIn(true);
startActivity(new Intent(this, MainActivity.class));
}
}
我已经浏览了一些关于SOF的其他文章,但在这种特殊情况下没有什么可以帮助我。也许我错过了一些简单的事情,但我已经有足够的时间试图修复它。有什么建议吗?
答案 0 :(得分:2)
我在下面的代码中指出了一些建议。请核实一下:
public class Login extends ActionBarActivity implements View.OnClickListener {
Button bLogin;
TextView registerLink;
EditText etUsername, etPassword;
String username, password;
UserLocalStore userLocalStore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
bLogin = (Button) findViewById(R.id.bLogin);
etUsername = (EditText) findViewById(R.id.etUsername);
etPassword = (EditText) findViewById(R.id.etPassword);
registerLink = (TextView) findViewById(R.id.tvRegisterLink);
您在其中一个EditText上获得了NullPointerException(此处为etUsername)。这意味着特定的编辑文本尚未初始化,您正在调用其中的方法。
在下面的这一特定行中,您将获得例外。您正在调用etUsername上的getText()方法,该方法为null
Log.v("username", etUsername.getText().toString());
按照以下步骤确定您的问题:
验证您的R.layout.activity_login xml文件中是否存在EditText的上述ID。
验证如果findViewById()中引用的EditText的ID属于您的R.layout.activity_login布局文件。
在onClick()方法中,userName和password变量初始化为默认值为null。
您需要从EditText中获取的值初始化它们(如果它不是null):
username = etUsername.getText().toString();
password = etPassword.getText().toString();
正确初始化变量后,请进一步使用它们:
User user = new User(username, password);
authenticate(user);
答案 1 :(得分:0)
用户名和密码字符串在未初始化的情况下使用 在你的onClickMethod
中User user = new User(username, password);
authenticate(user);
你创建一个带有空字符串的对象并使用它,这样就会出错。
答案 2 :(得分:0)
首先确保您的布局上没有任何其他视图,其ID相同 etUsername 和 etPassword ,您还必须初始化用户名和密码变量;改变你的情况:
case R.id.bLogin:
username=etUsername.getText().toString();
password=etPassword.getText().toString();
Log.v("username", username);
Log.v("password", password);
User user = new User(username, password);
authenticate(user);
break;