空的EditText错误(很多EditText)



该活动包含许多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());

最新更新