Android Java计算器inputG输入1-100范围校验逻辑错误排查
Android计算器Input数值范围校验问题排查与修复
问题背景
我正在开发一款计算器,目前需要实现inputG输入框的数值校验规则:用户输入的数值必须在1-100范围内,校验通过后再代入公式计算。使用的开发语言为Java。
初始错误代码
package com.example.rvbtcal; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView inputMoles = (EditText) findViewById(R.id.txtMoles); EditText inputML = (EditText) findViewById(R.id.txtmL); EditText inputG = (EditText) findViewById(R.id.txtG); TextView outputAnswer = (TextView) findViewById(R.id.txtAnswer); Button btnCalculate = (Button) findViewById(R.id.btnCalculate); Spinner spinner = (Spinner) findViewById(R.id.spnN); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.arrayN, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); double iM = Double.parseDouble(inputMoles.getText().toString()); double iML = Double.parseDouble(inputML.getText().toString()); double ioA = Double.parseDouble(inputG.getText().toString()); double textN = Double.parseDouble(spinner.getSelectedItem().toString()); if (ioA >= 0 || ioA <= 101){ Toast.makeText(MainActivity.this,"Enter a number between 1-100", Toast.LENGTH_SHORT); } btnCalculate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { double Answer1 = (iM * iML * textN) / (ioA / 1000); double FinalAnswer=(Answer1*1000000); outputAnswer.setText(String.format("%.3f",FinalAnswer)); // String FinalAnswer2=String.valueOf(FinalAnswer); // outputAnswer.setText(FinalAnswer2); } }); } }
第一次修改后存在的问题
将值读取和校验逻辑移到按钮点击事件后,依然存在两个问题:
- 即便触发If判断语句,程序依然会执行计算逻辑
- 尝试添加else语句后,无论inputG输入的数值是否符合范围要求,输出结果都为空
修改后错误代码
package com.example.rvbtcal; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView inputMoles = (EditText) findViewById(R.id.txtMoles); EditText inputML = (EditText) findViewById(R.id.txtmL); EditText inputG = (EditText) findViewById(R.id.txtG); TextView outputAnswer = (TextView) findViewById(R.id.txtAnswer); Button btnCalculate = (Button) findViewById(R.id.btnCalculate); Spinner spinner = (Spinner) findViewById(R.id.spnN); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.arrayN, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); btnCalculate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { double iM = Double.parseDouble(inputMoles.getText().toString()); double iML = Double.parseDouble(inputML.getText().toString()); double ioA = Double.parseDouble(inputG.getText().toString()); double textN = Double.parseDouble(spinner.getSelectedItem().toString()); if (ioA < 0 || ioA > 100) { Toast.makeText(MainActivity.this, "Enter a number between 1-100", Toast.LENGTH_SHORT); } double Answer1 = (iM * iML * textN) / (ioA / 1000); double FinalAnswer = (Answer1 * 1000000); outputAnswer.setText(String.format("%.3f", FinalAnswer)); } }); } }
问题根源
- 初始版本错误点:
- 输入值读取、校验逻辑全部写在
onCreate生命周期中,仅会在Activity启动时执行一次,读取的是控件初始值而非用户点击计算时的实时输入 - 校验逻辑条件错误:
ioA >= 0 || ioA <= 101为永真条件,所有输入都会触发提示 - Toast未调用
.show()方法,提示信息无法正常弹出
- 输入值读取、校验逻辑全部写在
- 第一次修改后遗留错误:
- 校验失败后没有终止后续逻辑,即便触发非法输入提示,计算代码依然会执行
- 校验条件遗漏等于0的边界情况,1以下的输入未完全拦截
- Toast未调用
.show()的问题未修复
最终修复代码
以下是可正常运行的修复后代码,可供遇到同类问题的开发者参考:
package com.example.rvbtcal; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView inputMoles = (EditText) findViewById(R.id.txtMoles); EditText inputML = (EditText) findViewById(R.id.txtmL); EditText inputG = (EditText) findViewById(R.id.txtG); TextView outputAnswer = (TextView) findViewById(R.id.txtAnswer); Button btnCalculate = (Button) findViewById(R.id.btnCalculate); Spinner spinner = (Spinner) findViewById(R.id.spnN); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.arrayN, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); btnCalculate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { double iM = Double.parseDouble(inputMoles.getText().toString()); double iML = Double.parseDouble(inputML.getText().toString()); double ioA = Double.parseDouble(inputG.getText().toString()); double textN = Double.parseDouble(spinner.getSelectedItem().toString()); if (ioA <= 0 || ioA > 100) { Toast.makeText(MainActivity.this, "Enter a number between 1-100", Toast.LENGTH_LONG).show(); outputAnswer.setText(""); return; } double Answer1 = (iM * iML * textN) / (ioA / 1000); double FinalAnswer = (Answer1 * 1000000); outputAnswer.setText(String.format("%.3f",FinalAnswer)); } }); } }
修复点说明
- 修正校验条件为
ioA <= 0 || ioA > 100,完全覆盖1-100以外的非法输入 - 校验失败后新增
return语句,直接终止当前点击事件逻辑,不再执行后续计算代码 - 补全Toast的
.show()调用,确保提示信息正常弹出 - 非法输入时清空输出框,避免旧结果干扰
内容的提问来源于stack exchange,提问作者iAisu
相关产品推荐
相关产品推荐

