Try Catch无法捕获错误:注册页面无提示弹窗问题求助
注册弹窗不显示问题的解决方案
咱们来一步步拆解你遇到的两个问题,然后给出针对性的修复方案:
问题1:未填写任何字段时,try-catch的提示弹窗不弹出
原因分析
你当前的代码没有在发送注册请求前做本地字段校验,直接把空字段传给了后端。而try-catch块只负责处理JSONException(也就是解析后端响应时的异常),如果后端收到空字段后返回了格式正确的JSON(比如{"success":false}),那代码不会进入catch分支,自然不会弹出提示。
修复方案
在发送请求前,先检查所有输入字段是否为空,为空的话直接弹出提示,不用继续执行请求逻辑:
// 在创建RegisterRequest之前添加这段校验 if (name.isEmpty() || email.isEmpty() || age.isEmpty() || password.isEmpty()) { AlertDialog.Builder builder = new AlertDialog.Builder(activityregister.this); builder.setMessage("请填写所有必填字段!") .setNegativeButton("返回修改", null) .create() .show(); return; // 终止后续请求流程 }
问题2:邮箱已存在时,预期的提示弹窗无法显示
原因分析
看你的onResponse方法,只有当success为true时执行跳转逻辑,但完全没有处理success为false的情况。catch块只在JSON解析失败时触发,而邮箱已存在时,后端应该会返回格式正确的{"success":false},这时候代码既不会跳转,也不会进入catch,所以没有任何提示。
修复方案
在if (success)后面添加else分支,专门处理注册失败的场景(包括邮箱已存在的情况):
@Override public void onResponse(String response) { try{ JSONObject jsonResponse = new JSONObject(response); boolean success = jsonResponse.getBoolean("success"); if (success) { Intent intent = new Intent(activityregister.this, LoginRegister.class); activityregister.this.startActivity(intent); } else { // 处理注册失败(比如邮箱已存在)的情况 AlertDialog.Builder builder = new AlertDialog.Builder(activityregister.this); builder.setMessage("注册失败!邮箱已存在或信息有误。") .setNegativeButton("重新尝试", null) .create() .show(); } } catch (JSONException e){ AlertDialog.Builder builder = new AlertDialog.Builder(activityregister.this); builder.setMessage("Register is not completed!") .setNegativeButton("Retry the registration!",null) .create() .show(); e.printStackTrace(); } }
完整修复后的代码
把上面的修改整合到你的代码里,完整版本如下:
public class activityregister extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); final EditText register_age = (EditText) findViewById(R.id.register_age); final EditText register_email = (EditText) findViewById(R.id.emails_reg); final EditText register_name = (EditText) findViewById(R.id.register_name); final EditText register_password = (EditText) findViewById(R.id.register_password); final Button reg_poga = (Button) findViewById(R.id.registacijas_poga); reg_poga.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final String name = register_name.getText().toString(); final String email = register_email.getText().toString(); final String age = register_age.getText().toString(); final String password = register_password.getText().toString(); // 新增:本地字段非空校验 if (name.isEmpty() || email.isEmpty() || age.isEmpty() || password.isEmpty()) { AlertDialog.Builder builder = new AlertDialog.Builder(activityregister.this); builder.setMessage("请填写所有必填字段!") .setNegativeButton("返回修改", null) .create() .show(); return; } final Response.Listener<String> responseListener = new Response.Listener<String>() { @Override public void onResponse(String response) { try{ JSONObject jsonResponse = new JSONObject(response); boolean success = jsonResponse.getBoolean("success"); if (success) { Intent intent = new Intent(activityregister.this, LoginRegister.class); activityregister.this.startActivity(intent); } else { // 新增:处理注册失败(含邮箱已存在)的情况 AlertDialog.Builder builder = new AlertDialog.Builder(activityregister.this); builder.setMessage("注册失败!邮箱已存在或信息有误。") .setNegativeButton("重新尝试", null) .create() .show(); } } catch (JSONException e){ AlertDialog.Builder builder = new AlertDialog.Builder(activityregister.this); builder.setMessage("Register is not completed!") .setNegativeButton("Retry the registration!",null) .create() .show(); e.printStackTrace(); } } }; RegisterRequest registerRequestt= new RegisterRequest(name, email, age, password, responseListener); RequestQueue Que = Volley.newRequestQueue(activityregister.this); Que.add(registerRequestt); } }); } }
这样修改后,两个问题都能得到解决:空字段时会直接弹出提示,邮箱已存在时也会在else分支里显示对应的弹窗。
内容的提问来源于stack exchange,提问作者humble man
相关产品推荐
相关产品推荐

