You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:15:00