jav.NullPointer .Исключение при использовании метода putExtra() Intent

#android

#Android

Вопрос:

Я продолжаю получать исключение NulPpointerException, когда я использую метод putExtras() Intent, как показано ниже. Именно в методе onClick я создаю intent и вызываю класс register activity . Я использую механизм аутентификации учетной записи Android. Всякий раз, когда нажимается текстовое представление signUpTxt, приложение отключается, и отображается трассировка журнала ошибок ниже. Чего мне не хватает?

Вот мой исходный код

 public class LoginActivity extends AccountAuthenticatorActivity {

    //.......................................
    //..........................................
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        actionBar = getSupportActionBar();
        actionBar.hide();

        mAccountManager = AccountManager.get(getBaseContext());

        String accountName = getIntent().getStringExtra(ARG_ACCOUNT_NAME);
        mAuthTokenType = getIntent().getStringExtra(ARG_AUTH_TYPE);

        if (mAuthTokenType == null)
            mAuthTokenType = AccountInfo.AUTHTOKEN_TYPE_FULL_ACCESS;

        if (accountName != null) {
            accountname = ((EditText) findViewById(R.id.txtAccountPhone));
            accountname.setText(accountName);
        }
        btnLogin = (Button) findViewById(R.id.btnLogin);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login();
            }
        });

        signUpTxt = (TextView) findViewById(R.id.txtSignUp);
        signUpTxt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Since there can only be one AuthenticatorActivity, we call the sign up activity, get his results,
                // and return them in setAccountAuthenticatorResult(). See finishLogin().
                Intent signup = new Intent(getBaseContext(), RegisterActivity.class);
                signup.putExtras(getIntent().getExtras());
                startActivityForResult(signup, REQ_SIGNUP);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        // The sign up activity returned that the user has successfully created an account
        if (requestCode == REQ_SIGNUP amp;amp; resultCode == RESULT_OK) {
            finishLogin(data);
        } else
            super.onActivityResult(requestCode, resultCode, data);
    }

    public void login() {

        final String userName = ((TextView) findViewById(R.id.txtAccountPhone)).getText().toString();
        final String userPass = ((TextView) findViewById(R.id.txtAccountPassword)).getText().toString();

        final String accountType = getIntent().getStringExtra(ARG_ACCOUNT_TYPE);

        new AsyncTask<String, Void, Intent>() {

            @Override
            protected Intent doInBackground(String... params) {

                Log.d("Slime", TAG   "> Started authenticating");

                String authtoken = null;
                Bundle data = new Bundle();
                try {
                    authtoken = AccountInfo.sServerAuthenticate.userSignIn(userName, userPass, mAuthTokenType);

                    data.putString(AccountManager.KEY_ACCOUNT_NAME, userName);
                    data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
                    data.putString(AccountManager.KEY_AUTHTOKEN, authtoken);
                    data.putString(PARAM_USER_PASS, userPass);

                } catch (Exception e) {
                    data.putString(KEY_ERROR_MESSAGE, e.getMessage());
                }

                final Intent res = new Intent();
                res.putExtras(data);
                return res;
            }

            @Override
            protected void onPostExecute(Intent intent) {
                if (intent.hasExtra(KEY_ERROR_MESSAGE)) {
                    Toast.makeText(getBaseContext(), intent.getStringExtra(KEY_ERROR_MESSAGE), Toast.LENGTH_SHORT).show();
                } else {
                    finishLogin(intent);
                }
            }
        }.execute();
    }

    private void finishLogin(Intent intent) {
        Log.d("Slime", TAG   "> finishLogin");

        String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
        final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));

        if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
            Log.d("Slime", TAG   "> finishLogin > addAccountExplicitly");
            String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
            String authtokenType = mAuthTokenType;

            // Creating the account on the device and setting the auth token we got
            // (Not setting the auth token will cause another call to the server to authenticate the user)
            mAccountManager.addAccountExplicitly(account, accountPassword, null);
            mAccountManager.setAuthToken(account, authtokenType, authtoken);
        } else {
            Log.d("Slime", TAG   "> finishLogin > setPassword");
            mAccountManager.setPassword(account, accountPassword);
        }

        setAccountAuthenticatorResult(intent.getExtras());
        setResult(RESULT_OK, intent);
        finish();
    }

}
  

Это журналы ошибок из logcat

 06-30 14:53:46.109: E/AndroidRuntime(6015): FATAL EXCEPTION: main
06-30 14:53:46.109: E/AndroidRuntime(6015): java.lang.NullPointerException
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.os.Bundle.putAll(Bundle.java:281)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.content.Intent.putExtras(Intent.java:4828)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at com.rowland.slumber.LoginActivity$2.onClick(LoginActivity.java:86)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.view.View.performClick(View.java:2485)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.view.View$PerformClick.run(View.java:9080)
06-30 14:53:46.109: E/AndroidRuntime(6015):     at android.os.Handler.handleCallback(Handler.java:587)
  

Редактировать, это строка 86

 public void onClick(View v) {
                // Since there can only be one AuthenticatorActivity, we call the sign up activity, get his results,
                // and return them in setAccountAuthenticatorResult(). See finishLogin().
                Intent signup = new Intent(getBaseContext(), RegisterActivity.class);
               signup.putExtras(getIntent().getExtras()); //LINE 86 
                startActivityForResult(signup, REQ_SIGNUP);
            }
        });
    }
  

Я передаю дополнительные функции из Authenticator.java который расширяет AbstractAccountAuthenticator в методе addAccount()

 @Override
    public Bundle addAccount(AccountAuthenticatorResponse response,
            String accountType, String authTokenType,
            String[] requiredFeatures, Bundle options)
            throws NetworkErrorException {
        Bundle resu<

        if (hasAccount(mContext)) {
            result = new Bundle();
            Intent i = new Intent(mContext, LoginActivity.class);
            i.putExtra(LoginActivity.ARG_ACCOUNT_TYPE, accountType);
            i.putExtra(LoginActivity.ARG_AUTH_TYPE, authTokenType);
            i.putExtra(LoginActivity.ARG_IS_ADDING_NEW_ACCOUNT, true);
            i.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,response);
            result.putParcelable(AccountManager.KEY_INTENT, i);

            return resu<

        }
  

Комментарии:

1. пожалуйста, выделите, какая строка 86 в вашем LiginActivity.java файл

2. signup.putExtras(GetIntent().getExtras()); здесь исключение NullPointerException

3. Тогда, вероятно, GetIntent().getExtras() выдает вам null, вы проверили это?

4. Ваше getIntent().getExtras() значение равно нулю. из какого действия вы пытаетесь получить это дополнение?

5. На основе API: Intent.getExtras() возвращает сопоставление всех дополнительных функций, ранее добавленных с помощью putExtra(), или null, если ни одна из них не была добавлена , Может быть, дополнительных функций нет, и поэтому вы передаете null в putExtras?

Ответ №1:

На основе API:

Intent.getExtras() возвращает: отображение всех дополнений, ранее добавленных с помощью putExtra(), или null, если ни одно из них не было добавлено

Я предполагаю, что вы не передаете никаких дополнительных функций и, следовательно, передаете null в метод Intent.putExtras() … Или, если вы думаете, что вы, возможно, делаете это неправильно.

Ответ №2:

Из GetIntent().getStringExtra(ARG_ACCOUNT_NAME);

Я могу сказать, что вы использовали метод putStringExtra вместо putExtras .

Поэтому, когда вы пытаетесь GetIntent().getExtras, он равен нулю.