出于某种原因,这正在崩溃,我不知道为什么



我正在 Android Studio 中做一个术语刻度转换器,但是当我在任何 EditText 上输入一个数字并按下计算按钮时,它崩溃了,我不知道为什么。

这是MainActivity.java代码:


private ViewHolder mViewHolder = new ViewHolder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mViewHolder.editValueCel = findViewById(R.id.edit_value_cel);
this.mViewHolder.editValueFahr = findViewById(R.id.edit_value_fahr);
this.mViewHolder.editValueKelvin = findViewById(R.id.edit_value_kelvin);
this.mViewHolder.buttonCalculate = findViewById(R.id.button_calculate);
this.mViewHolder.textCelsius = findViewById(R.id.tot_celcius);
this.mViewHolder.textFahr = findViewById(R.id.tot_fahr);
this.mViewHolder.textKelvin = findViewById(R.id.tot_kelvin);
this.mViewHolder.buttonCalculate.setOnClickListener(this);

}
@Override
public void onClick(View view) {
if (view.getId() == R.id.button_calculate){
String valorCel = this.mViewHolder.editValueCel.getText().toString();
String valorFahr = this.mViewHolder.editValueFahr.getText().toString();
String valorKelvin = this.mViewHolder.editValueKelvin.getText().toString();
if (("".equals(valorCel)) && ("".equals(valorFahr)) && ("".equals(valorKelvin))){
Toast.makeText(this, this.getString(R.string.informe_valor), Toast.LENGTH_SHORT).show();
}else {
Double celsius = Double.valueOf(valorCel);
Double fahr = Double.valueOf(valorFahr);
Double kelvin = Double.valueOf(valorKelvin);
if (("".equals(valorFahr)) && ("".equals(valorKelvin))){
this.mViewHolder.textCelsius.setText(String.valueOf(celsius));
this.mViewHolder.textFahr.setText(String.valueOf((9*celsius+160)/5));
this.mViewHolder.textKelvin.setText(String.valueOf(celsius+273));
}else if(("".equals(valorCel)) && ("".equals(valorKelvin))){
this.mViewHolder.textCelsius.setText(String.valueOf(((fahr-32)/9)*5));
this.mViewHolder.textFahr.setText(String.valueOf(fahr));
this.mViewHolder.textKelvin.setText(String.valueOf((5*fahr+2297)/9));
}else if(("".equals(valorCel)) && ("".equals(valorFahr))){
this.mViewHolder.textCelsius.setText(String.valueOf(kelvin-273));
this.mViewHolder.textFahr.setText(String.valueOf((9*kelvin-2297)/5));
this.mViewHolder.textKelvin.setText(String.valueOf(kelvin));
}else{
Toast.makeText(this, this.getString(R.string.erro_muitos_valores), Toast.LENGTH_SHORT).show();
}
}
}
}
private static class ViewHolder{
EditText editValueCel;
EditText editValueFahr;
EditText editValueKelvin;
TextView textCelsius;
TextView textFahr;
TextView textKelvin;
Button buttonCalculate;
}
}

如果需要在这里发布activity_main.xml代码,请告诉我,我会发布它。

首先将字符串转换为双精度

Double celsius = Double.valueOf(valorCel);
Double fahr = Double.valueOf(valorFahr);
Double kelvin = Double.valueOf(valorKelvin);

但是从下面的代码来看,很可能一个或多个字符串为空,这给出了一个NumberFormatException(或 null 给出一个NullPointerException),所以你需要将转换移动到其中一个 if/else 条件内。

最好使用isEmpty()而不是比较字符串是否等于 ">

if (valorFahr.isEmpty() && valorKelvin.isEmpty()){
Double celsius = Double.valueOf(valorCel);
this.mViewHolder.textCelsius.setText(String.valueOf(celsius));
this.mViewHolder.textFahr.setText(String.valueOf((9*celsius+160)/5));
this.mViewHolder.textKelvin.setText(String.valueOf(celsius+273));
} else if(valorCel.isEmpty() && valorKelvin.isEmpty()){
Double fahr = Double.valueOf(valorFahr);
this.mViewHolder.textCelsius.setText(String.valueOf(((fahr-32)/9)*5));
this.mViewHolder.textFahr.setText(String.valueOf(fahr));
this.mViewHolder.textKelvin.setText(String.valueOf((5*fahr+2297)/9));
} else if(valorCel.isEmpty() && valorFahr.isEmpty()){
Double kelvin = Double.valueOf(valorKelvin);
this.mViewHolder.textCelsius.setText(String.valueOf(kelvin-273));
this.mViewHolder.textFahr.setText(String.valueOf((9*kelvin-2297)/5));
this.mViewHolder.textKelvin.setText(String.valueOf(kelvin));
...

不知道应用程序的其余部分如何工作,检查并非所有 3 个字符串都为空或其中任何一个作为此代码的一部分为 null 可能仍然是一件好事。

所以也许在 if/else 部分之前

if ((valorFahr == null || valorKelvin == null || valorCel == null) ||
(valorFahr.isEmpty() && valorKelvin.isEmpty() && valorCel.isEmpty())) {
//some error handling
}

最新更新