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

Android登录注册页面异常:错误凭证仍登录+JSONException报错

问题分析与解决方案

我来帮你梳理并解决你遇到的两个核心问题:输入错误账号密码仍跳转页面,以及org.json.JSONException: No value for res_response异常。

1. 错误账号密码仍跳转页面的原因与修复

问题根源

在MainActivity的登录按钮点击事件中,你发起网络请求compare_version()后,没有等待服务器返回响应,直接执行了页面跳转代码:

else {
    Intent i = new Intent(MainActivity.this,Userlist.class);
    startActivity(i);
}

网络请求是异步操作,这段代码会在请求发出后立刻执行,完全忽略了服务器返回的验证结果。

修复方案

把页面跳转逻辑移到网络请求的onResponse回调中,根据服务器返回的真实resp_code判断是否登录成功:

btnSignIn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final String name = username.getText().toString().trim();
        final String pass = passwordd.getText().toString().trim();

        // 先做输入合法性验证,再发起请求
        if (TextUtils.isEmpty(name)) {
            username.setError("Please enter username");
            username.requestFocus();
            return;
        }
        if (TextUtils.isEmpty(pass)) {
            passwordd.setError("Please enter your Password");
            passwordd.requestFocus();
            return;
        }

        // 验证通过后发起登录请求
        compare_version();
    }
});

然后修改compare_version()方法,根据服务器返回的状态码处理跳转:

private void compare_version() {
    JSONObject parameters = new JSONObject();
    try {
        parameters.put("type", "userlogin");
        parameters.put("username", username.getText().toString());
        parameters.put("password", passwordd.getText().toString());
    } catch (JSONException e) {
        e.printStackTrace(); // 不要吞掉异常,方便调试
    }
    JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, parameters, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONObject jsonObject = response;
                // 不要硬覆盖resp_code!使用服务器返回的真实状态码
                String resp_code = jsonObject.getString("resp_code");
                // 先判断字段是否存在,避免JSONException
                String resp_msg = jsonObject.has("res_response") ? jsonObject.getString("res_response") : "Unknown error";
                
                System.out.println("response version =====" + response);
                
                if (resp_code.equals("200")) { // 用equals替代compareTo更直观
                    Toast.makeText(MainActivity.this, "Login successful: " + resp_msg, Toast.LENGTH_SHORT).show();
                    // 登录成功才跳转
                    Intent i = new Intent(MainActivity.this,Userlist.class);
                    startActivity(i);
                } else {
                    Toast.makeText(MainActivity.this, "Login failed: " + resp_msg, Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(MainActivity.this, "Parse response failed", Toast.LENGTH_SHORT).show();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.e("Error: ", error.getMessage());
            Toast.makeText(MainActivity.this, "Network error", Toast.LENGTH_SHORT).show();
        }
    });
    MyApplication.getInstance().addToRequestQueue(req);
}

2. JSONException: No value for res_response的解决

问题根源

当输入错误账号密码时,服务器返回的JSON数据中可能不存在res_response字段,或者字段名拼写与服务器返回不一致(比如服务器实际返回的是resp_response)。同时你之前硬写resp_code = "200"会覆盖服务器返回的错误状态码,导致无法正确处理失败场景。

修复方案

  • 在获取字段前,先用jsonObject.has("res_response")判断字段是否存在,避免直接调用getString()抛出异常;
  • 不要手动覆盖resp_code,保留服务器返回的真实状态码;
  • 确认服务器接口文档,确保字段名完全匹配(比如检查是res_response还是resp_response)。

3. 注册页面的额外优化

Registration中按钮点击事件的输入验证顺序错误:你先调用了compare_version()发起请求,再做输入合法性检查,这会导致无效输入也会发送请求。调整顺序:

btnRegister.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final String name = username.getText().toString().trim();
        final String emaill = email.getText().toString().trim();
        final String passwordd = password.getText().toString().trim();
        final String mobilee = mobile.getText().toString().trim();

        // 先做所有输入验证
        if (TextUtils.isEmpty(name)) {
            username.setError("Please enter username");
            username.requestFocus();
            return;
        }
        if (TextUtils.isEmpty(emaill)) {
            email.setError("Please enter your email");
            email.requestFocus();
            return;
        }
        if (!android.util.Patterns.EMAIL_ADDRESS.matcher(emaill).matches()) {
            email.setError("Enter a valid email");
            email.requestFocus();
            return;
        }
        if (TextUtils.isEmpty(passwordd)) {
            password.setError("Enter a password");
            password.requestFocus();
            return;
        }
        if (TextUtils.isEmpty(mobilee)) {
            mobile.setError("Enter a mobile number");
            mobile.requestFocus();
            return;
        }

        // 验证通过后再发起注册请求
        compare_version();
        Log.e("TAG","Message");
    }
});

同时,注册的compare_version()方法也需要添加字段存在判断,避免同样的JSONException:

private void compare_version() {
    JSONObject parameters = new JSONObject();
    try {
        parameters.put("type", "signup");
        parameters.put("username", username.getText().toString());
        parameters.put("email", email.getText().toString());
        parameters.put("mobileno", mobile.getText().toString());
        parameters.put("password", password.getText().toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }
    JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, parameters, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONObject jsonObject = response;
                String resp_code = jsonObject.getString("resp_code");
                String resp_msg = jsonObject.has("res_response") ? jsonObject.getString("res_response") : "Registration failed";
                
                System.out.println("response version =====" + response);
                
                if (resp_code.equals("200")) {
                    Toast.makeText(Registration.this, "Registration successful: " + resp_msg, Toast.LENGTH_SHORT).show();
                    // 注册成功后可以跳转回登录页面
                    finish();
                } else {
                    Toast.makeText(Registration.this, "Registration failed: " + resp_msg, Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(Registration.this, "Parse response failed", Toast.LENGTH_SHORT).show();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.e("Error: ", error.getMessage());
            Toast.makeText(Registration.this, "Network error", Toast.LENGTH_SHORT).show();
        }
    });
    MyApplication.getInstance().addToRequestQueue(req);
}

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:42