android - hashSet上的android空指针异常
问题描述
这是我的 MainActivity 类:
package com.example.alon.a2018_17_12_userloginexhomework;
公共类 MainActivity 扩展 AppCompatActivity 实现 View.OnClickListener {
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();
}
}
每次我单击注册按钮时,我都会在 HashSet 对象上获得 NPE。谁能指出它的原因?似乎 HashSet 对象初始化在 click 方法之前,所以我真的不知道为什么它会变为空。
我得到的错误:
java.lang.NullPointerException:尝试在 com.example.alon.a2018_17_12_userloginexhomework.MainActivity.signUp(MainActivity.java: 144)
解决方案
在 onCreate 方法中,您调用:
init() - > 在这里你初始化你的注册用户集
但不久之后,你打电话给:
checkForLoggedOrRegisteredUsers() -> 在这里您再次初始化registeredUsersSet,但这次来自sharedPreferences,在您的情况下它可能返回null。
(registeredUsersSet = getSharedPreferences(PREFS, MODE_PRIVATE)
.getStringSet(REGISTERED_USERS_SET, null);)
你错过了这个:
if (registeredUsersSet ==null)
registeredUsersSet = new HashSet<>();
推荐阅读
- javascript - 如何在 React Native 中使用 SVG?
- python-3.x - Pipenv 无法从 github 工作流中获取秘密令牌
- flutter - 当 targetsdkversion = 30 时无法在外部存储上创建目录
- javascript - 如何在select2中动态函数使用ajax jquery
- php - 如何从连接中选择列?
- java - 用junit运行柏树
- omnet++ - 构建 INET、Veins、Veins_inet3、SimuLTE 以集成到我的模拟时出错
- python - 使用python将文件上传到s3存储桶时权限被拒绝
- python - 如何使用 ax.get_subplotspec().is_first_col() 而不是 is_first_col
- java - 如何更改 javafx 警告框的图标