该活动包含许多edittext(大约40个),用户在其中输入数字,然后添加它们。但是当其中一个EditTexts是空的,它给出一个错误,应用程序停止。我读过很多解决方案,但我不想为每个EditText编写代码。
这里是一些代码(写了450行,不打算全部展示,但它们都是相似的)
EditText mark1;
EditText mark2;
EditText mark3;
EditText mark4;
EditText mark5;
TextView marksem1;
Button calcsem1;
double mark1calc=0;
double mark2calc=0;
double mark3calc=0;
double mark4calc=0;
double mark5calc=0;
double totalsem1=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.etsia_gia_ata_layout);
initControls();
private void initControls() {
// Course 1 sem 1 calc
mark1=(EditText)findViewById(R.id.mark1);
mark2=(EditText)findViewById(R.id.mark2);
mark3=(EditText)findViewById(R.id.mark3);
mark4=(EditText)findViewById(R.id.mark4);
mark5=(EditText)findViewById(R.id.mark5);
marksem1=(TextView)findViewById(R.id.total1calc);
calcsem1=(Button)findViewById(R.id.total1);
calcsem1.setOnClickListener(new Button.OnClickListener()
{public void onClick
(View v) {calcsem1();}
private void calcsem1() {
mark1calc=Double.parseDouble(mark1.getText().toString());
mark2calc=Double.parseDouble(mark2.getText().toString());
mark3calc=Double.parseDouble(mark3.getText().toString());
mark4calc=Double.parseDouble(mark4.getText().toString());
mark5calc=Double.parseDouble(mark5.getText().toString());
totalsem1=(9*mark1calc+6*mark2calc+6*mark3calc+6*mark4calc+3*mark5calc)/30;
marksem1.setText(Double.toString(totalsem1));
marksem1.setText(String.format("%.2f", totalsem1));
}});
}
}
希望有解决办法。非常感谢!
您的问题来自这样一个事实:空字符串上的Double.parseDouble(...)
将抛出NumberFormatException
。您可以像这样替换每一行:
try {
mark1calc = Double.parseDouble(mark1.getText().toString());
} catch (NumberFormatException e) {
mark1calc = 0;
}
这是很多额外的代码,所以我建议实现这样的东西:
public static Double safeParse(String input) {
try {
return Double.parseDouble(input);
} catch (NumberFormatException e) {
return 0d;
}
}
// ...
mark1calc = safeParse(mark1.getText().toString());
mark2calc = safeParse(mark2.getText().toString());
mark3calc = safeParse(mark3.getText().toString());
// ...
(这假设你想让一个空框的值为0;您可以根据需要调整默认值)
我想你的问题是与parseDouble。您可以编写自己的protected parseDouble,它将尝试捕获解析文本,如果抛出异常,则只返回0。
像这样:
private static double safeParseDouble(String text)
{
try
{
double result = Double.parseDouble(text);
return result;
}
catch (Exception ex)
{
return 0;
}
}
Double.parseDouble()
可以抛出异常,所以您需要使用try-catch
块。
try {
mark1calc=Double.parseDouble(mark1.getText().toString());
mark2calc=Double.parseDouble(mark2.getText().toString());
mark3calc=Double.parseDouble(mark3.getText().toString());
mark4calc=Double.parseDouble(mark4.getText().toString());
mark5calc=Double.parseDouble(mark5.getText().toString());
totalsem1=(9*mark1calc+6*mark2calc+6*mark3calc+6*mark4calc+3*mark5calc)/30;
marksem1.setText(Double.toString(totalsem1));
marksem1.setText(String.format("%.2f", totalsem1));
} catch (Exception e) {
// handle errors...
}
您可以将解析语句替换为三元语句,如下所示:
mark2calc = mark4.getText().toString().equals("") ? 0 : Double.parseDouble(mark4.getText().toString());