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

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);


            }
        });

    }
}

第一次修改后存在的问题

将值读取和校验逻辑移到按钮点击事件后,依然存在两个问题:

  1. 即便触发If判断语句,程序依然会执行计算逻辑
  2. 尝试添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:54:02