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(); }
两种写法均未解决崩溃问题。
解决方案
崩溃的核心原因是空值判断逻辑位置错误,以及存在字符串比较、单位判断的逻辑错误,修正步骤如下:
将空值判断放在输入解析之前
原代码先执行Double.parseDouble(enterTemp.getText().toString()),当输入为空时,会抛出NumberFormatException直接导致APP崩溃,必须先判断输入是否为空,再进行后续操作。使用
equals()比较字符串内容
Java中==比较的是对象引用,字符串内容相等需要用equals()方法,否则单位转换的判断逻辑会失效。修正相同单位的判断逻辑
原代码中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
相关产品推荐
相关产品推荐

