首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >hashSet上的android空指针异常

hashSet上的android空指针异常
EN

Stack Overflow用户
提问于 2018-12-17 01:41:58
回答 1查看 24关注 0票数 -1

这是我的MainActivity类:

代码语言:javascript
复制
package com.example.alon.a2018_17_12_userloginexhomework;

公共类MainActivity扩展了AppCompatActivity实现的View.OnClickListener {

代码语言:javascript
复制
public static final String USERNAME = "username";
public static final String SP_LOGGED_USER = "spLoggedUser";
public static final String PREFS = "prefs";
public static final int REQUEST_CODE = 123;
public static final String DESTINATION = "destination";
public static final String REGISTERED_USERS_SET = "registeredUsersSet";
EditText etUsername, etPassword;
Button btnLogin, btnSignup;
public static HashMap<String, User> hashMap;
public static SharedPreferences sharedPreferences;
Set<String> registeredUsersSet;


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

private void checkDestination() {
    int destination = getIntent().getIntExtra(DESTINATION, -1);
    if (destination == 0)
        finish();
}

private void checkForLoggedOrRegisteredUsers() {
    String loggedInUser = getSharedPreferences(PREFS, MODE_PRIVATE)
            .getString(SP_LOGGED_USER, null);
    if (loggedInUser != null){
        User user = new User(loggedInUser);
        Intent intent = new Intent(this, ActivityUserLoggedIn.class);
        intent.putExtra(USERNAME, user.getUsername());
        startActivityForResult(intent,REQUEST_CODE);
    }
    try {
        registeredUsersSet = getSharedPreferences(PREFS, MODE_PRIVATE)
                .getStringSet(REGISTERED_USERS_SET, null);
    }catch (NullPointerException e){
        e.printStackTrace();
    }
    if (registeredUsersSet != null){
        for (String s : registeredUsersSet){
            User u = new User(s);
            hashMap.put(u.getUsername(),u);
        }
    }
}

private void init() {
    registeredUsersSet = new HashSet<>();
    etUsername = findViewById(R.id.etUsername);
    etPassword = findViewById(R.id.etPassword);
    btnLogin = findViewById(R.id.btnLogin);
    btnSignup = findViewById(R.id.btnSignup);
    hashMap = new HashMap<>();
    sharedPreferences = getSharedPreferences(PREFS,MODE_PRIVATE);
    btnLogin.setOnClickListener(this);
    btnSignup.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.btnSignup:
            signUp();
            break;
        case R.id.btnLogin:
            login();
            break;
    }
}

private void login() {
    String user = etUsername.getText().toString();
    String password = etPassword.getText().toString();
    //logic check:
    if (user.length() < 1 || password.length() < 1){
        Toast.makeText(this,
                "user or pass must be above 1 chars",
                Toast.LENGTH_SHORT).show();
    }
    //username check
    if (hashMap.containsKey(user)){
        //password check:
        if (Objects.requireNonNull(hashMap.get(user)).getPassword().equals(password)){
            //all checks are okay, logging in:
            Intent intent = new Intent(this, ActivityUserLoggedIn.class);
            intent.putExtra(USERNAME, user);
            sharedPreferences.edit().putString(SP_LOGGED_USER,user).apply();
            startActivityForResult(intent, REQUEST_CODE);
        } else {
            //password error:
            Toast.makeText(this,
                    "password does not match, please retry"
                    , Toast.LENGTH_SHORT).show();
            etPassword.setText("");
        }
    } else {
        //username error:
        Toast.makeText(this,
                "User does not exists, please try again"
                , Toast.LENGTH_SHORT).show();
        clearEditTexts();
    }
}

private void signUp() {
    String user = etUsername.getText().toString();
    String password = etPassword.getText().toString();
    if (user.length() < 1 || password.length() < 1){
        Toast.makeText(this,
                "user or pass must be above 1 chars",
                Toast.LENGTH_SHORT).show();
    } else if (hashMap.containsKey(user)){
        Toast.makeText(this,
                "user already exists, please choose a different usename",
                Toast.LENGTH_SHORT).show();
        clearEditTexts();
    } else {
        User newUser = new User(user,password);
        hashMap.put(user,newUser);
        registeredUsersSet.add(newUser.toString());
        Toast.makeText(this,
                "successfully registered used name " + user,
                Toast.LENGTH_SHORT).show();
        clearEditTexts();
    }
}

private void clearEditTexts(){
    etUsername.setText("");
    etPassword.setText("");
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK){
        if (data != null) {
            int destination = data.getIntExtra(DESTINATION, -1);
            if (destination == 0)
                finish();
        }
    }
}

@Override
protected void onStop() {
    super.onStop();
    sharedPreferences.edit().putStringSet(REGISTERED_USERS_SET, registeredUsersSet).apply();
}

}

每次我单击sign up按钮时,我都会得到HashSet对象上的NPE。有谁能指出原因吗?看起来HashSet对象初始化比click方法早了很多,所以我真的不知道为什么它会变成空。

我得到的错误是:

boolean java.lang.NullPointerException:尝试对com.example.alon.a2018_17_12_userloginexhomework.MainActivity.signUp(MainActivity.java:144)处的null对象引用调用接口方法“

java.util.Set.add(java.lang.Object)”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-17 01:55:20

在onCreate方法中,调用:

init() ->在这里初始化你的registeredUsersSet

但不久之后,您调用:

checkForLoggedOrRegisteredUsers() ->在这里您再次初始化registeredUsersSet,但这次是从sharedPreferences初始化,在本例中它可能返回null。

代码语言:javascript
复制
(registeredUsersSet = getSharedPreferences(PREFS, MODE_PRIVATE)
                .getStringSet(REGISTERED_USERS_SET, null);) 

你遗漏了这个:

代码语言:javascript
复制
if (registeredUsersSet ==null) 
registeredUsersSet = new HashSet<>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53804841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档