Android Studio Java简单登录if条件仅部分生效 密码错误APP崩溃问题
问题修复方案
崩溃根因
崩溃的核心原因是遍历用户列表的循环条件写越界了:
ArrayList的索引范围是0 到 mUsers.size()-1,你代码里写的for(int i=0; i<=mUsers.size();i++)超出了合法索引范围- 输入正确账号密码时,匹配后你直接修改了
i的值跳出循环,不会触发越界 - 输入错误账号密码时,循环会执行到
i = mUsers.size(),调用mUsers.get(i)会抛出索引越界异常,导致应用直接崩溃,因此不会执行后续的else分支。
修复后完整代码
public class MainActivity extends AppCompatActivity { private EditText etName; private EditText etPassword; private TextView tvLoginMsg; public Button btnLogin; public static int loginUserIndex; public static ArrayList<User> mUsers; private String nameHolder; private String passHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etName = findViewById(R.id.etpsudo); etPassword = findViewById(R.id.etpaswword); tvLoginMsg = findViewById(R.id.txtlog); btnLogin = findViewById(R.id.btnlogin); // 初始化用户列表 mUsers = new ArrayList<>(); mUsers.add(new User("amine","12345")); mUsers.add(new User("bouhali","4523")); mUsers.add(new User("khawla","ae12")); btnLogin.setOnClickListener(new View.OnClickListener() { @SuppressLint("SetTextI18n") @Override public void onClick(View v) { nameHolder = etName.getText().toString().trim(); passHolder = etPassword.getText().toString().trim(); int isLoginSuccess = 0; // 修复循环条件,<=改为< for(int i=0; i < mUsers.size(); i++){ if(nameHolder.equals(mUsers.get(i).getmNom()) && passHolder.equals(mUsers.get(i).getmPass())){ loginUserIndex = i; isLoginSuccess = 1; break; // 匹配到直接跳出循环,写法更规范 } } if (isLoginSuccess == 1){ Intent intent = new Intent(MainActivity.this, newacc.class); startActivity(intent); } else{ tvLoginMsg.setText("账号或密码错误"); } } }); } }
额外优化说明
- 将校验标记
Tester改为点击事件内的局部变量,避免全局变量复用导致的逻辑错误 - 增加
trim()处理输入的账号密码,过滤用户输入的前后空格 - 调整变量命名为Java常用的驼峰格式,提升代码可读性
- 匹配成功后用
break跳出循环,替代原来修改i值的写法,逻辑更清晰
内容的提问来源于stack exchange,提问作者Amine Bouhabinie
相关产品推荐
相关产品推荐

