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

EditText为空时弹出Toast提示及温度转换APP崩溃修复

Android温度转换APP崩溃问题解决

问题背景

开发一款Android温度转换APP,需求如下:

  • 点击转换按钮时,若输入框EditText为空,弹出Toast提示用户填写内容
  • 若两个Spinner(摄氏度/华氏度选择器)选中相同单位,弹出Toast提示

当前问题:输入框为空时点击按钮APP直接崩溃,尝试两种空值判断写法均无效。

用户原始代码

public class MainActivity extends AppCompatActivity {

    private TextView result;
    private EditText enterTemp;
    double result0;

    Spinner ConvertFromUnitTypeSpinner;
    Spinner ConvertToUnitTypeSpinner;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //set spinner variables
        ConvertFromUnitTypeSpinner = (Spinner) findViewById(R.id.ConvertFromUnitTypeSpinner);
        ConvertToUnitTypeSpinner =  (Spinner) findViewById(R.id.ConvertToUnitTypeSpinner);

        //String for spinner items
        String [] unitTypes =  {"Fahrenheit", "Celsius"};

        //set up adapter for the layout of the spinner
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this,      
         android.R.layout.simple_list_item_1, unitTypes);

        //set up adapter to spinner
        ConvertFromUnitTypeSpinner.setAdapter(spinnerAdapter);
        ConvertToUnitTypeSpinner.setAdapter(spinnerAdapter);

        //set up convert button
        Button convert = findViewById(R.id.convert);
        result = findViewById(R.id.result);
        enterTemp = findViewById(R.id.enterTemp);

        convert.setOnClickListener(new View.OnClickListener(){
            @SuppressLint("SetTextI18n")
            @Override
            public void onClick (View v) {
                double temp = Double.parseDouble(enterTemp.getText().toString());

                if(ConvertFromUnitTypeSpinner.getSelectedItem()=="Fahrenheit"&&
                 ConvertToUnitTypeSpinner.getSelectedItem().toString()=="Celsius")
                {
                    result0 = (temp - 32 )*5/9;
                    result.setText(String.valueOf(result0));
                }
                if(ConvertFromUnitTypeSpinner.getSelectedItem()=="Celsius"
                  &&ConvertToUnitTypeSpinner.getSelectedItem().toString()=="Fahrenheit")
                {
                    result0 = (temp * 9/5) + 32;
                    result.setText(String.valueOf(result0));
                }
                if (ConvertToUnitTypeSpinner.getSelectedItem()
                    ==ConvertToUnitTypeSpinner.getSelectedItem()){
                        result.setText("Units are the same!");
                    }
                if (enterTemp.getText().toString().length() == 0)
                {
                    Toast.makeText(MainActivity.this, "It's empty", Toast.LENGTH_SHORT).show();
                  }
            }
        });
    }
}

用户尝试的修改

最初的空值判断代码:

if (enterTemp.getText().toString().length() == 0) {
    Toast.makeText(MainActivity.this, "It's empty", Toast.LENGTH_SHORT).show();
}

修改后尝试的写法:

if(isEmpty(enterTemp.getText().toString())){
    Toast.makeText(MainActivity.this, "It's empty", Toast.LENGTH_SHORT).show();
}

两种写法均未解决崩溃问题。

解决方案

崩溃的核心原因是空值判断逻辑位置错误,以及存在字符串比较、单位判断的逻辑错误,修正步骤如下:

  1. 将空值判断放在输入解析之前
    原代码先执行Double.parseDouble(enterTemp.getText().toString()),当输入为空时,会抛出NumberFormatException直接导致APP崩溃,必须先判断输入是否为空,再进行后续操作。

  2. 使用equals()比较字符串内容
    Java中==比较的是对象引用,字符串内容相等需要用equals()方法,否则单位转换的判断逻辑会失效。

  3. 修正相同单位的判断逻辑
    原代码中ConvertToUnitTypeSpinner.getSelectedItem() == ConvertToUnitTypeSpinner.getSelectedItem()永远为true,需要改为比较两个Spinner的选中项。

修正后的完整代码

public class MainActivity extends AppCompatActivity {

    private TextView result;
    private EditText enterTemp;
    double result0;

    Spinner ConvertFromUnitTypeSpinner;
    Spinner ConvertToUnitTypeSpinner;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化Spinner
        ConvertFromUnitTypeSpinner = findViewById(R.id.ConvertFromUnitTypeSpinner);
        ConvertToUnitTypeSpinner = findViewById(R.id.ConvertToUnitTypeSpinner);

        //Spinner选项
        String[] unitTypes = {"Fahrenheit", "Celsius"};

        //设置Spinner适配器
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, unitTypes);
        ConvertFromUnitTypeSpinner.setAdapter(spinnerAdapter);
        ConvertToUnitTypeSpinner.setAdapter(spinnerAdapter);

        //初始化按钮与控件
        Button convert = findViewById(R.id.convert);
        result = findViewById(R.id.result);
        enterTemp = findViewById(R.id.enterTemp);

        convert.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("SetTextI18n")
            @Override
            public void onClick(View v) {
                //1. 先判断输入是否为空
                String inputText = enterTemp.getText().toString().trim();
                if (inputText.isEmpty()) {
                    Toast.makeText(MainActivity.this, "请输入温度值", Toast.LENGTH_SHORT).show();
                    return; //空输入直接终止后续逻辑
                }

                //2. 解析输入(此时输入非空,不会崩溃)
                double temp;
                try {
                    temp = Double.parseDouble(inputText);
                } catch (NumberFormatException e) {
                    Toast.makeText(MainActivity.this, "请输入有效的数字", Toast.LENGTH_SHORT).show();
                    return;
                }

                //3. 获取两个Spinner的选中项
                String fromUnit = ConvertFromUnitTypeSpinner.getSelectedItem().toString();
                String toUnit = ConvertToUnitTypeSpinner.getSelectedItem().toString();

                //4. 判断单位是否相同
                if (fromUnit.equals(toUnit)) {
                    Toast.makeText(MainActivity.this, "转换单位不能相同", Toast.LENGTH_SHORT).show();
                    result.setText("");
                    return;
                }

                //5. 执行温度转换
                if (fromUnit.equals("Fahrenheit") && toUnit.equals("Celsius")) {
                    result0 = (temp - 32) * 5 / 9;
                    result.setText(String.format("%.2f", result0)); //保留两位小数更友好
                } else if (fromUnit.equals("Celsius") && toUnit.equals("Fahrenheit")) {
                    result0 = (temp * 9 / 5) + 32;
                    result.setText(String.format("%.2f", result0));
                }
            }
        });
    }
}

额外优化说明

  • 添加了trim()去除输入前后空格,避免用户输入空格导致的空值误判
  • 增加了try-catch捕获非数字输入的异常,进一步提升APP稳定性
  • 使用String.format()保留两位小数,优化结果显示效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:40:36