EditText = null对象引用?

时间:2015-08-06 05:42:51

标签: java android

我正在使用登录和注册系统,并且在尝试点按“登录”时遇到此错误。按钮。

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的其他文章,但在这种特殊情况下没有什么可以帮助我。也许我错过了一些简单的事情,但我已经有足够的时间试图修复它。有什么建议吗?

3 个答案:

答案 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());

按照以下步骤确定您的问题:

  1. 验证您的R.layout.activity_login xml文件中是否存在EditText的上述ID。

  2. 验证如果findViewById()中引用的EditText的ID属于您的R.layout.activity_login布局文件。

  3. 在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;